約束是一種限制,它通過對表的行或列的數據做出限制,來確保表的數據的完整性、唯一性。
MYSQL中,常用的幾種約束:
約束類型: | 主鍵 | 外鍵 | 唯一 | 非空 | 自增 | 默認值 |
---|---|---|---|---|---|---|
關鍵字: | primary key | foreign key | unique |
not null |
auto_increment |
default |
1、主鍵約束 primary key
主鍵約束相當於 唯一約束 + 非空約束 的組合,主鍵約束列不允許重復,也不允許出現空值。
每個表最多只允許一個主鍵,建立主鍵約束可以在列級別創建,也可以在表級別創建。
當創建主鍵的約束時,系統默認會在所在的列和列組合上建立對應的唯一索引。
-- 基本模式 create table temp( id int primary key, name varchar(20) ); -- 組合模式 create table temp( id int , name varchar(20), pwd varchar(20), primary key(id, name) ); -- 刪除主鍵約束 alter table temp drop primary key; -- 添加主鍵約束 alter table temp add primary key(id,name); -- 修改主鍵約束 alter table temp modify id int primary key;
2、外鍵約束 foreign key
外鍵約束是保證一個或兩個表之間的參照完整性,外鍵是構建於一個表的兩個字段或是兩個表的兩個字段之間的參照關系
-- 基本模式 -- 主表 create table temp( id int primary key, name varchar(20) ); -- 副表 create table temp2( id int, name varchar(20), classes_id int, foreign key(id) references temp(id) ); -- 多列外鍵組合,必須用表級別約束語法 -- 主表 create table classes( id int, name varchar(20), number int, primary key(name,number) ); -- 副表 create table student( id int auto_increment primary key, name varchar(20), classes_name varchar(20), classes_number int, /*表級別聯合外鍵*/ foreign key(classes_name, classes_number) references classes(name, number) ); -- 刪除外鍵約束 alter table student drop foreign key student_id; -- 增加外鍵約束 alter table student add foreign key(classes_name, classes_number) references classes(name, number);
3、 唯一約束unique
唯一約束是指定table的列或列組合不能重復,保證數據的唯一性。
唯一約束不允許出現重復的值,但是可以為多個null。
同一個表可以有多個唯一約束,多個列組合的約束。
在創建唯一約束時,如果不給唯一約束名稱,就默認和列名相同。
唯一約束不僅可以在一個表內創建,而且可以同時多表創建組合唯一約束。
-- 創建表時設置,表示用戶名、密碼不能重復 create table temp( id int not null , name varchar(20), password varchar(10), unique(name,password) ); -- 添加唯一約束 alter table temp add unique (name, password); -- 修改唯一約束 alter table temp modify name varchar(25) unique; -- 刪除約束 alter table temp drop index name;
4、非空約束 not null 與 默認值 default
非空約束用於確保當前列的值不為空值,非空約束只能出現在表對象的列上。
Null類型特征:
所有的類型的值都可以是null,包括int、float 等數據類型
-- 創建table表,ID 為非空約束,name 為非空約束 且默認值為abc create table temp( id int not null, name varchar(255) not null default 'abc', sex char null ); -- 增加非空約束 alter table temp modify sex varchar(2) not null; -- 取消非空約束 alter table temp modify sex varchar(2) null; -- 取消非空約束,增加默認值 alter table temp modify sex varchar(2) default 'abc' null;