MYSQL約束的新增和刪除

2021-08-20 14:41:32 字數 3237 閱讀 5178

在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; 

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

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

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

這時向子表中插入資料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)

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

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

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

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

約束新增和刪除

約束的目的就是確保表中的資料的完整性。常用的約束型別如下 主鍵約束 primary key constraint 要求主鍵列唯一,並且不允許為空 唯一約束 unique constraint 要求該列唯一,允許為空,但只能出現乙個空值 檢查約束 check constraint 某列取值範圍限制 格...

MySQL 新增約束,修改約束,刪除約束

alter table 新增,修改,刪除表的列,約束等表的定義。檢視列 desc 表名 修改表名 alter table t book rename to bbb 新增列 alter table 表名 add column 列名 varchar 30 刪除列 alter table 表名 drop ...

MySQL中新增 刪除約束

mysql中6種常見的約束 主鍵約束 primary key 外來鍵約束 foreign key 非空約束 not null 唯一性約束 unique 預設值約束 defualt 自增約束 aoto increment 下面是新增 刪除這幾種約束的一些方法。我已經建了資料庫 1 新增約束 2 1 建...