亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Mysql入門基礎(chǔ) 數(shù)據(jù)庫(kù)創(chuàng)建篇

 更新時(shí)間:2010年04月11日 02:29:28   作者:  
Mysql入門基礎(chǔ) 數(shù)據(jù)庫(kù)創(chuàng)建篇,剛接觸php與mysql的朋友可以參考下。多寫多測(cè)試。
1.創(chuàng)建數(shù)據(jù)表---基礎(chǔ)(高手跳過(guò))
正統(tǒng)方法:create [TEMPORARY] table 表名 [if not exists]
(創(chuàng)建的列項(xiàng)定義)
[表的選項(xiàng)]
[分區(qū)的選項(xiàng)];#正統(tǒng)的創(chuàng)建方式,具體的參數(shù),請(qǐng)參考mysql手冊(cè),在這里不做詳細(xì)的解釋,只說(shuō)一些比較特別的。
例:
復(fù)制代碼 代碼如下:

create table user(id int unsigned not null auto_increment,
username char(15),
sex enum('M','F') default 'M',
userid varchar(20),
PRIMARY KEY(id,userid),
INDEX idx_user(userid),
)engine='innodb' charset=utf8;

復(fù)制數(shù)據(jù)庫(kù)結(jié)構(gòu):
復(fù)制代碼 代碼如下:

create [temporary] table 表名 [if not exists] like 已存在的表名;//模仿已存在的表創(chuàng)建一個(gè)結(jié)構(gòu)完全相同的表
mysql>create table vip_user like user;
mysql>create table vip_user select * from user where 0;//上例還可以這樣做,僅復(fù)制結(jié)構(gòu)

復(fù)制并copy數(shù)據(jù)庫(kù)
復(fù)制代碼 代碼如下:

create [temporary] table 新表名 select * from 舊表名;#用戶可以人為的指定后續(xù)select組合成需要的語(yǔ)句。
create table dst_tbl(
id int not null auto_increment,
primary key(id)
) select a,b,c from src_tbl;

以此來(lái)創(chuàng)建各種各樣的符合用戶要求的數(shù)據(jù)庫(kù),這里只是做一個(gè)拋磚引玉。
2.查看修改的數(shù)據(jù)表結(jié)構(gòu)
復(fù)制代碼 代碼如下:

mysql> desc 數(shù)據(jù)表名;#查看數(shù)據(jù)表的結(jié)構(gòu)
mysql> show create table 數(shù)據(jù)表名\G #查看數(shù)據(jù)表的構(gòu)成語(yǔ)句,\G和;的意義相同,只不過(guò)\G是縱向顯示,這樣看的更清楚。
mysql> show table status like '數(shù)據(jù)表名'\G #查看數(shù)據(jù)表的狀態(tài)
mysql> show columns from 數(shù)據(jù)表名;#查看數(shù)據(jù)表的結(jié)構(gòu),同desc一樣,不過(guò)使用這條語(yǔ)句后面加like '字段'可以只顯示指定字段

3. 更改變據(jù)庫(kù)的結(jié)構(gòu)
我們首先創(chuàng)建一個(gè)表
mysql> create table vip(id int null,username varchar(30));
修改表結(jié)構(gòu)中的數(shù)據(jù)類型
復(fù)制代碼 代碼如下:

mysql>alter table vip modify id smallint default 1;#更改數(shù)據(jù)記錄為1.
mysql>#alter table vip modify id smallint auto_increment;#大家執(zhí)行一下這句話會(huì)提示錯(cuò)誤,因?yàn)閙ysql中要求自動(dòng)增長(zhǎng)的列設(shè)為主鍵
mysql>alter table vip add primary(id);#設(shè)vip中的值的主鍵為id,執(zhí)行這條語(yǔ)句后再執(zhí)行上面的就沒(méi)問(wèn)題了。
mysql>alter table vip modify username char(30) not null;#改變vip的username為char(30);
mysql>alter table vip modify username mediumtext first; #改變vip中的username,并將它設(shè)在最前面字段,還有一個(gè)是after 字段,是指放在某字段后

對(duì)已有表新增字段
mysql> alter table vip add sex enum('M','F') default 'M' not null after id;#新增sex字段為enum類型,放在id的后面.

對(duì)已有字段改名
mysql>alter table vip change sex usersex tinyint default 0 not null after username;改名字段sex為usersex并改變類型和位置。
注:僅alter中modify,change很相似,但是modify不能改名只能改結(jié)構(gòu),但change即可以改名,也可以改類型。

刪除字段
mysql>alter table vip drop usersex;#刪除 usersex字段,警告,所有的該字段數(shù)據(jù)都會(huì)丟失。
數(shù)據(jù)庫(kù)改名
mysql>alter table vip rename to vip_user;數(shù)據(jù)庫(kù)進(jìn)行改名。
改變數(shù)據(jù)表引擎
mysql>alter table vip engine="MyISAM";

注意,修改數(shù)據(jù)結(jié)構(gòu)是一個(gè)很危險(xiǎn)的事,最好做好備份,以防不側(cè)。
還有部分的alter的語(yǔ)句和技巧我們將在以后涉及處一一到來(lái).....
4. 關(guān)于數(shù)據(jù)約束
數(shù)據(jù)約束在mysql5中支持的越來(lái)越好了,但是現(xiàn)有的數(shù)據(jù)約束僅限于innodb,傳說(shuō)中mysql5.2也會(huì)支持對(duì)數(shù)據(jù)約束的支持(期待..)
首先我們了解一下什么是數(shù)據(jù)約束,因?yàn)槲覀兤匠?chuàng)建表中都可能會(huì)有互相關(guān)聯(lián)的信息,而數(shù)據(jù)約束是將兩個(gè)表進(jìn)行關(guān)聯(lián)的一種紐帶。
例如:兩個(gè)表,一個(gè)usertype,一為userid,usertype中有一個(gè)關(guān)鍵字key為用戶類型編號(hào),userid表中也有一 user_key對(duì)應(yīng)著usertype表中的
1.首先我們要保證userid表中的所有值都在usertype中
2.其次我們要保證usertype中的值key進(jìn)行改變userid表中的user_key值也會(huì)變化。
3.usertype中的值不能隨意刪除,除非userid表中不存在該usertype類型的值,如果要強(qiáng)制刪除則會(huì)刪除userid中的所有 usertype的值。
如果沒(méi)有數(shù)據(jù)約束,我們每次insert/update可能要用數(shù)條語(yǔ)句才能保證數(shù)據(jù)的正確完整性,如果使用數(shù)據(jù)約束則只需要在定義的時(shí)候進(jìn)行一下處理,而不用擔(dān)心太多。而且最重要的是使用數(shù)據(jù)約束能夠很好的保證數(shù)據(jù),業(yè)務(wù)的完整性。
呵呵,說(shuō)了這么多,還沒(méi)有說(shuō)數(shù)據(jù)約束的缺點(diǎn):慢,使用數(shù)據(jù)約束要比不使用數(shù)據(jù)約束慢得多,而且用戶每次插入數(shù)據(jù)或更改數(shù)據(jù),數(shù)據(jù)庫(kù)系統(tǒng)都會(huì)花一定的時(shí)間進(jìn)行一定的檢查.但是隨著 mysql的日益成熟,這種速度會(huì)有著很大的改進(jìn)。
就個(gè)人而言,我覺(jué)得非商務(wù)、實(shí)時(shí)系統(tǒng)對(duì)數(shù)據(jù)業(yè)務(wù)完整性要求較高的情況下使用數(shù)據(jù)約束還是很有必要的。其它情況下就仁者見(jiàn)仁智者見(jiàn)智了。

5.數(shù)據(jù)約束簡(jiǎn)明解析
所以外鍵的定義必須必須滿足以下三種情況:
1.兩個(gè)表必須是innodb表類型
2.指定為外鍵的列必須進(jìn)行索引
3.兩個(gè)表中關(guān)聯(lián)的外鍵類型必須相符。
我們先來(lái)看例子,在例子中進(jìn)行學(xué)習(xí):
mysql> create table parent(id int null,primary key(id)) engine=innodb; #創(chuàng)建一個(gè)主表
mysql> create table child(id int,parent_id int,
foreign key(parent_id)
references parent(id) on delete restrict on update cascade
) engine=innodb; #創(chuàng)建一個(gè)從表,并約外鍵關(guān)鍵字為parent_id,建立之間的關(guān)聯(lián)關(guān)系。
mysql> insert into parent values(1),(2),(3);#對(duì)主表插入數(shù)據(jù)
mysql> insert into child values(1,1),(1,2),(1,3);#對(duì)子表進(jìn)行插入數(shù)據(jù),對(duì)應(yīng)不同的parent_id子child的id值均為1;
mysql> #insert into child values(1,1),(1,2),(1,3),(1,4); #看一下這會(huì)發(fā)生什么?報(bào)錯(cuò)是吧?什么原因?大家想想
說(shuō)明:因?yàn)槲覀冊(cè)趧?chuàng)建語(yǔ)句的時(shí)候就約定了數(shù)據(jù)是進(jìn)行外鍵關(guān)聯(lián)的,而parent中不存在id值為4的主鍵,那么子鍵當(dāng)然更新不了了。
這時(shí)數(shù)據(jù)庫(kù)中的值為:
parent child
id id parent_id
1 1 1
2 1 2
3 1 3
我們繼續(xù)操作以體現(xiàn)外鍵關(guān)聯(lián)表的作用
mysql> update parent set id=4 where id=1;#改變parent的值看一下child的反應(yīng)
mysql> select * from parent;
mysql> select * from child;
這時(shí)數(shù)據(jù)庫(kù)中的值為:
parent child
id id parent_id
2 1 4
3 1 2
4 1 3
通過(guò)以上的例子大家可以清楚的看到用戶只是改變parent的值,而關(guān)聯(lián)的child值會(huì)自動(dòng)改變。我們繼續(xù)
mysql> insert into child values(2,4),(3,4),(4,4);#為子表再添加一些其它的值。
mysql> #delete from parent where id=4; #大家執(zhí)行這條語(yǔ)句看一下有什么結(jié)果,錯(cuò)誤吧?我們來(lái)分析一下提示錯(cuò)誤
我們回顧一下我們創(chuàng)建外鍵的說(shuō)細(xì)情況和關(guān)鍵語(yǔ)句:
foreign key(parent_id) #這句話的意思是指定對(duì)外關(guān)聯(lián)鍵為本表的parent_id;
references parent(id) on delete restrict on update cascade#這句話是則約束語(yǔ)句,references可以約束本數(shù)據(jù)庫(kù)的外鍵即parend_id與 parent數(shù)據(jù)表的id子鍵對(duì)應(yīng),并約束了on delete,on update時(shí)的操作,mysql共有以下幾種操作:
(1) restrict、no action 表示如果子表中有匹配的記錄,則不允許對(duì)父表對(duì)應(yīng)候選鍵進(jìn)行update/delete操作 ,大家現(xiàn)在明白了吧?為什么我們執(zhí)行delete from parent where id=4;時(shí)出現(xiàn)錯(cuò)誤,因?yàn)樽颖?child)中還存在值.
(2) set null 在父表上update/delete記錄時(shí),將子表上匹配記錄的列設(shè)為null,但要注意子表的外鍵列不能為not null
(3) cascade 在父表上update/delete記錄時(shí),同步update/delete掉子表的匹配記錄
大家可以根據(jù)自己的需要設(shè)置不同的動(dòng)作,例如,我們要在父表刪除時(shí),自動(dòng)刪除子表的關(guān)聯(lián)值,則我們需進(jìn)行設(shè)置:
references parent(id) on delete cascade on update cascade,實(shí)驗(yàn)之前我們須要知道
1.已經(jīng)定義設(shè)置好的外鍵是無(wú)法再行更改的,必須要?jiǎng)h除外鍵后再行創(chuàng)建(可能還有別的方法,哪位高手指點(diǎn)一下)
mysql> show create table child/G #得到 constraint(約束)的名字
說(shuō)明:constraint是可以缺省的,用于指定約束的名字,如果不指定則系統(tǒng)會(huì)自動(dòng)為它取名,例如我們可以這樣:
constraint fk_child_key
foreign key(parent_id)
references parent(id) on delete restrict on update cascade;
這樣我們就指定了這個(gè)約束的整體名稱為fk_child_key,以后可以對(duì)這個(gè)進(jìn)行操作了.
mysql> alter table child drop foreign key fk_child_key;#刪除約束
mysql> alter table child add foreign key ('parent_id)
references parent(id) on delete cascade
on update cascade;
mysql> show create table child/G #至此約束已更改,用戶可以查看一下更改情況

mysql>delete from parent where id=4;#我們?cè)賵?zhí)行上面的那句,這時(shí)沒(méi)錯(cuò)誤了吧?
mysql>select * from parent;
mysql>select * from child; #我們可以看到現(xiàn)在與parent_id為4的全部刪除。呵呵,以后都可以方便的使用了
這時(shí)數(shù)據(jù)庫(kù)中的值為:
parent child
id id parent_id
2 1 2
3 1 3
6.數(shù)據(jù)約束 的額外說(shuō)明
如果定義了數(shù)據(jù)約束,則數(shù)據(jù)的插入或更改速度會(huì)很慢,特別是更改數(shù)據(jù)結(jié)構(gòu),插入數(shù)據(jù)時(shí),效率低的可怕。
當(dāng)客戶執(zhí)行l(wèi)oad data(載入數(shù)據(jù),后續(xù)會(huì)介紹),alter table時(shí)建議使用以下命令,暫時(shí)關(guān)閉數(shù)據(jù)約束,等完成后再開(kāi)啟,這樣速度至少可以提升20倍以上。
mysql> set foreign_key_checks=0;#關(guān)閉數(shù)據(jù)約束
mysql> load data infile '文件絕對(duì)地址' into table 表名;#從文本文件中載入大量數(shù)據(jù)
mysql> set foreign_key_checks=1;#打開(kāi)數(shù)據(jù)約束

相關(guān)文章

  • MySQL 5.7.13 源碼編譯安裝配置方法圖文教程

    MySQL 5.7.13 源碼編譯安裝配置方法圖文教程

    這篇文章主要介紹了MySQL 5.7.13 源碼編譯安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • MySQL 觸發(fā)器的基礎(chǔ)操作(六)

    MySQL 觸發(fā)器的基礎(chǔ)操作(六)

    這篇文章主要為大家詳細(xì)介紹了MySQL 觸發(fā)器的基礎(chǔ)操作,告訴大家什么是MySQL觸發(fā)器,如何查看觸發(fā)器,感興趣的小伙伴們可以參考一下
    2016-08-08
  • 一起了解了解MySQL存儲(chǔ)引擎

    一起了解了解MySQL存儲(chǔ)引擎

    大家好,本篇文章主要講的是一起了解了解MySQL存儲(chǔ)引擎,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Mysql源碼學(xué)習(xí)筆記 偷窺線程

    Mysql源碼學(xué)習(xí)筆記 偷窺線程

    安裝完Mysql后,使用VS打開(kāi)源碼開(kāi)開(kāi)眼,我嘞個(gè)去,這代碼和想象中怎么差別這么大呢?
    2011-04-04
  • MYSQL配置參數(shù)優(yōu)化詳解

    MYSQL配置參數(shù)優(yōu)化詳解

    MySQL是優(yōu)化難度最大的一個(gè)部分,不但需要理解一些MySQL專業(yè)知識(shí),同時(shí)還需要長(zhǎng)時(shí)間的觀察統(tǒng)計(jì)并且根據(jù)經(jīng)驗(yàn) 進(jìn)行判斷,然后設(shè)置合理的參數(shù)。下面我們了解一下MySQL優(yōu)化的一些基礎(chǔ)
    2018-07-07
  • 使用phpMyAdmin批量修改Mysql數(shù)據(jù)表前綴的方法

    使用phpMyAdmin批量修改Mysql數(shù)據(jù)表前綴的方法

    這篇文章主要介紹了使用phpMyAdmin批量修改Mysql數(shù)據(jù)表前綴的方法,需要的朋友可以參考下
    2015-09-09
  • 升級(jí)到MySQL5.7后開(kāi)發(fā)不得不注意的一些坑

    升級(jí)到MySQL5.7后開(kāi)發(fā)不得不注意的一些坑

    這篇文章主要給大家介紹了關(guān)于升級(jí)到MySQL5.7后開(kāi)發(fā)不得不注意的一些坑,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • 解析SQL語(yǔ)句中Replace INTO與INSERT INTO的不同之處

    解析SQL語(yǔ)句中Replace INTO與INSERT INTO的不同之處

    本篇文章是對(duì)SQL語(yǔ)句中Replace INTO與INSERT INTO的不同之處進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • 最新評(píng)論