MySQL中約束保存在information_schema數據庫的table_constraints中,可以通過該表查詢約束信息;
常用5種約束:
not null: 非空約束,指定某列不為空
unique: 唯一約束,指定某列和幾列組合的數據不能重復
primary key: 主鍵約束,指定某列的數據不能重復、唯一
foreign key: 外鍵,指定該列記錄屬於主表中的一條記錄,參照另一條數據
check: 檢查,指定一個表達式,用於檢驗指定數據
MySQL不支持check約束,但可以使用check約束,而沒有任何效果;
根據約束數據列限制,約束分為:
單列約束:每個約束只約束一列
多列約束:每個約束約束多列數據
一、not null約束
非空約束用於確保當前列的值不為空值,非空約束只能出現在表對象的列上。
Null類型特征:
所有的類型的值都可以是null,包括int、float 等數據類型
create table temp( id int not null, name varchar(255) not null default 'abc', sex char null ) //上面的table 加上了非空約束,也可以用alter來修改或增加非空約束 //增加非空約束 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;
二、unique
唯一約束是指定table的列或列組合不能重復,保證數據的唯一性。
唯一約束不允許出現重復的值,但是可以為多個null。
同一個表可以有多個唯一約束,多個列組合的約束。
在創建唯一約束時,如果不給唯一約束名稱,就默認和列名相同。
唯一約束不僅可以在一個表內創建,而且可以同時多表創建組合唯一約束。
MySQL會給唯一約束的列上默認創建一個唯一索引;
create table temp( id int not null, name varchar(25), password varchar(16), --使用表級約束語法 constraint uk_name_pwd unique(name, password) ); //表示用戶名和密碼組合不能重復 //添加唯一約束 alter table temp add unique (name, password); alter table temp modify name varchar(25) unique; //刪除約束 alter table temp drop index name;
三、primary key
主鍵約束相當於 唯一約束 + 非空約束 的組合,主鍵約束列不允許重復,也不允許出現空值。
每個表最多只允許一個主鍵,建立主鍵約束可以在列級別創建,也可以在表級別創建。
當創建主鍵的約束時,系統默認會在所在的列和列組合上建立對應的唯一索引。
MySQL的主鍵名總是PRIMARY。
//列模式 create table temp( /*主鍵約束*/ id int primary key, name varchar(25) ); create table temp2( id int not null, name varchar(25), pwd varchar(15), constraint pk_temp_id primary key(id) ); //組合模式 create table temp2( id int not null, name varchar(25), pwd varchar(15), constraint pk_temp_id primary key (name, pwd) ); //alter刪除主鍵約束 alter table temp drop primary key; //alter添加主鍵約束 alter table temp add primary key(name, pwd); //alter 修改列為主鍵 alter table temp modify id int primary key; //設置主鍵自增 create table temp( id int auto_increment primary key, name varchar(20), pwd varchar(16) ); //auto_increment自增模式,設置自增后插入數據的時候就不需要給該列插入值了。
四、foreign key約束
外鍵約束是保證一個或兩個表之間的參照完整性,外鍵是構建於一個表的兩個字段或是兩個表的兩個字段之間的參照關系
//創建外鍵約束 //主表 create table classes( id int auto_increment primary key , name varchar(20), ); //從表 create table student( id int anto_increment, name varchar(22), constraint pk_id primary key(id), classes_id int references class(id) ); //通常先建主表,然后再建從表,這樣從表的參照引用的表才存在 //表級別創建外鍵約束: create table student( id int auto_increment primary key, name varchar(25), classes_id int, foreign key (classes_id) references classes(id) ); //上面的創建外鍵的方法沒有指定約束名稱,系統會默認給外鍵約束分配外鍵約束名稱,命名為student_idfk_n 其中student是表名, n是當前約束從1開始的整數 //指定約束名稱 create table student( id int auto_increment primary key, name varchar(25), classes_id int, /*指定約束名稱*/ constraint fk_classes_id foreign key(classes_id) references classes(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_idfk_1; alter table student drop foreign key fk_student_id; //增加外鍵約束 alter table student add foreign key(classes_name, classes_number) references classes(name, number); //自引用、自關聯(遞歸表、樹狀表) create table tree( id int auto_increment primary key, name varchar(50), parent_id int, foreign key(parent_id) references tree(id) ); //級聯刪除:刪除主表的數據時,關聯的從表數據也刪除,則需要在建立外鍵約束的后面增加on delete cascade或on delete set null, 前者是級聯刪除,后者是將從表的關聯列的值設置為null 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) on delete cascade );
五、check約束
MySQL可以使用check約束,但check約束對數據驗證沒有任何作用。
create table temp( id int auto_increment, name varchar(20), age int, primary key(id), /*check約束*/ check(age > 20) ); //上面check約束要求age必須大於0,但沒有任何作用。創建table的時候沒有任何錯誤或警告。
