1. 程式人生 > >MYSQL約束的新增和刪除

MYSQL約束的新增和刪除

在MYSQL資料庫中,建表時就可以進行對錶的各項進行一些操作,例如設定主鍵或者非空約束,這裡主要講講如何在建表後進行新增約束和刪除約束

首先,建一個十分普通的表

create table test(
test_no char(10),
test_point int,

test_student char(11));

這裡有test_no,test_point,test_student三列,此時沒有任何約束。

常用的約束有1、主鍵約束。2、非空約束。3、外來鍵約束。4、唯一約束。5、check(檢查)約束

如果我們想要讓test_no列作為主鍵

alter table test add primary key(test_no);

即可設定test_no列為主鍵。

這裡如果我們要設定test_student為唯一約束,在命令列可以敲上述程式碼的類比形式

alter table test add unique(test_student);

但現在我認為test_no作為主鍵不太合適,於是想要刪除它

alter table test drop primary key; 直接就可以刪除該表中的主鍵

在刪除主鍵時,由於主鍵對於一個表來說是唯一的,那麼對於一個表的唯一約束卻可以是有很多的,而使用上述方法建立唯一約束,是不知道約束名稱的,當然,預設該約束的名稱等於該列的名稱,但是如果修改了這列的名稱,而約束的名稱確是不會改變的,這樣在修改的時候容易引起問題,最好的方法是檢視該表的約束再進行操作,使用下列程式碼

show keys from test;

觀察到我之前設定的唯一性約束

我想刪除這個約束

Alter table test index test_student;

再次使用show keys from test就為空了。

外來鍵約束

外來鍵約束其實是將主表的某些列和子表的某些列關聯在一起,其目的是為了不讓子表的列隨意增加主表列中不存在的項,也就是如果主表中的test_no如果沒有111111111這個編號,那麼子表中的test_no 也不能插入有關這個編號的列

首先建立一個主表

create table test1(

test_no char(10),

test_sem int);

同樣沒有任何約束,這時直接使用之前的alter語句建立外來鍵約束。

alter table test add foreign key N1(test_no) references test1(test_no); # 注:使用alter語句的才是子表,也就是受約束的表

發現報錯,ERROR 1215 (HY000): Cannot add foreign key constraint,為什麼呢,因為對於主表的列來說,沒有主鍵約束和唯一性約束的列是沒有資格作為列建立外來鍵約束的。所以我們要給它新增一些東西

alter table test1 add primary key (test_no);

然後alter table test add foreign key (test_no) references test1(test_no);實現了外來鍵約束。這樣的約束建立,外來鍵名稱是列名或者一個其他生成的名稱,需要用show create table test來檢視,觀察到表的結構語句中已經有了外來鍵,並且外來鍵名稱為test_ibfk_1



首先,刪除外來鍵約束

alter table test drop foreign key test_ibfk_1; 

然後想想怎麼設計一個自己想要的外來鍵名稱,觀察上面的結構語句可以受到啟發,模仿上面的語句嘗試一下。

alter table test add constraint N1 foreign key (test_no) references test1(test_no);



發現key名為N1,成功新增約束,但是如果再次刪除約束N1,外來鍵消失,但是索引N1仍然保留。

仍然保留的原因是因為使用了constraint,具體暫時不準備解釋,注意一下就行。

這時向子表中插入資料insert into test values('1234567890',99,'name');

報錯,觀察原因,顯然是因為子表中的列受到限制了

這時向父表中增加一些東西,依次執行

insert into test1 values('1234567890',2);

insert into test values('1234567890',99,'name');

顯然成功了,外來鍵約束十分方便的限制了一些東西,這在實際設計中能夠避免許許多多的資料錯誤。

not null 約束就不談了,和primary key 和 unique 一樣,它實在沒有什麼太多好講的。這裡寫一下怎麼建立和刪除非空約束。

alter table test modify test_student char(10); 刪除非空約束

其中modify 的意思可以理解為重構,你甚至可以用modify來進行對其他約束的建立,例如 alter table modify test_student char(10) unique; 這樣可以直接建立唯一約束。所以,modify是十分方便的。

alter table test modify test_student char(10) not null; 建立非空約束

最後說說怎麼建立check約束和常用在哪裡。

先說說常用在哪裡,比如一個表中記錄了員工的姓名,性別和年齡,姓名有最大長度,這體現於它的結構,例如 name char(8)

但是對於性別和年齡,性別只有男和女,年齡不大於80歲可能和小於16歲(溫馨提示:僱傭童工犯法),這裡用結構難以直接約束它,所以要用到check

先建表 create table worker(name char(8),sex char(2), age int);

為它建立約束alter table worker add check(sex in ('男','女'));沒有報錯

但是insert into worker values("Jack","a",18);

不會報錯,這是因為mysql 對於check會進行解析,但check約束實際無效。而要實際實現check約束的功能一般使用enum型別或者觸發器來實現,這裡就不深究了。