數據庫的完整性約束用來防止對數據的意外破壞,來保證數據的安全性和一致性。
主鍵
1.創建表時候指定主鍵
創建表user(id, username, age),並且id字段非空自增。
CREATE TABLE user(
id BIGINT(20) NOT NULL AUTO_INCREMENT
,username VARCHAR(16) NOT NULL
,age TINYINT
,PRIMARY KEY(id)
);
給數據庫插入3條字段。
2.修改表中字段為主鍵
創建表user1(id, username),不設置主鍵,通過修改設置主鍵。
CREATE TABLE user1(
id BIGINT(20)
,username VARCHAR(16) NOT NULL
);
ALTER TABLE user1
ADD PRIMARY KEY(id)
,MODIFY id BIGINT(20) AUTO_INCREMENT;
通過SHOW INDEX FROM user1查看表user1的主鍵,可以看到有一個名字為PRIMARY的主鍵索引。
3.刪除主鍵
刪除表user1中的主鍵,如果主鍵為自增,那么還需要將自增去掉。
ALTER TABLE user1
DROP PRIMARY KEY
,MODIFY id BIGINT(20);
外鍵
外鍵用來指定參照完整性約束,被指定為外鍵的列必需要有索引,外鍵參考列必需為另一個表的主鍵。
1.創建表的時候指定外鍵
創建表article(id, u_id, article_name),u_id為該表的外鍵,引用user表中的id。
CREATE TABLE article(
id BIGINT(20) NOT NULL AUTO_INCREMENT
,u_id BIGINT(20) NOT NULL
,article_name VARCHAR(16) NOT NULL
,PRIMARY KEY(id)
,CONSTRAINT fk_user_article_uid FOREIGN KEY (u_id) REFERENCES user(id)
);
通過SHOW INDEX FROM article查看索引,可以看到該表中有兩個索引。
2.修改表時添加外鍵約束
修改的時候表中如果有記錄就會出錯。
ALTER TABLE article
ADD CONSTRAINT fk_user_article_uid FOREIGN KEY(u_id) REFERENCES user(id);
添加了外鍵之后,再插入不存在user的id值的u_id字段就會出錯。
3.刪除外鍵
ALTER TABLE article
DROP FOREIGN KEY fk_user_article_uid;
通過SHOW INDEX FROM article可以看到,雖然外鍵被刪除,但是之前設置為外鍵的列依然有索引。
這時再進行插入操作,插入在user表中不存在的u_id值,這時可以成功地進行插入。
INSERT INTO article(u_id, article_name)
VALUES (4, 'article4');
唯一
1.創建表的時候創建唯一約束條件
第一種方法,這種方法不能指定唯一索引的名字。
CREATE TABLE test1(
id BIGINT(20) NOT NULL AUTO_INCREMENT
,test1 INT UNIQUE KEY
,PRIMARY KEY(id)
);
查看索引,可以看到唯一索引的名字與字段名相同。
如果插入相同的test1,就會報錯。
第二種方法,可以制定唯一索引的名字
CREATE TABLE test1(
id BIGINT(20) NOT NULL AUTO_INCREMENT
,test INT
,PRIMARY KEY(id)
,UNIQUE KEY uk_test(test)
);
通過查看索引可以看到,非空索引的名稱是設定的名稱。
2.修改表時添加
ALTER TABLE test1
ADD UNIQUE uk_test(test);
3.刪除
ALTER TABLE test1
DROP INDEX uk_test;
非空
1.創建表的時候指定
CREATE TABLE test(
id BIGINT(20) NOT NULL AUTO_INCREMENT
,test1 INT NOT NULL
,PRIMARY KEY(id)
);
2.修改刪除
刪除非空
ALTER TABLE test
MODIFY test1 INT;
添加非空
ALTER TABLE test
MODIFY test1 INT NOT NULL;
總結
上述的四種約束性添加中,主鍵、外鍵、唯一在創建時就直接建立了該列的索引,非空是與索引無關的,不過非空字段也是可以建立索引的。