sql約束
MySQL中約束保存在information_schema數據庫的table_constraints中,可以通過該表查詢約束信息;
約束主要完成對數據的檢驗,保證數據庫數據的完整性;如果有相互依賴數據,保證該數據不被刪除。
常用五類約束:
not null:非空約束,指定某列不為空
unique: 唯一約束,指定某列和幾列組合的數據不能重復
primary key:主鍵約束,指定某列的數據不能重復、唯一
foreign key:外鍵,指定該列記錄屬於主表中的一條記錄,參照另一條數據
check:檢查,指定一個表達式,用於檢驗指定數據
註意: MySQL不支持check約束,但可以使用check約束,而沒有任何效果;
根據約束數據列限制,約束可分為:
單列約束:每個約束只約束一列
多列約束:每個約束約束多列數據
1、not null
非空約束用於確保當前列的值不為空值,非空約束只能出現在表對象的列上。
Null類型特征: 所有的類型的值都可以是null,包括int、float等數據類型 空字符串””是不等於null,0也不等於null
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’;
2、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;
3、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自增模式,設置自增後在插入數據的時候就不需要給該列插入值了。
4、foreign key
外鍵約束是保證一個或兩個表之間的參照完整性,外鍵是構建於一個表的兩個字段或是兩個表的兩個字段之間的參照關系。 也就是說從表的外鍵值必須在主表中能找到或者為空。 當主表的記錄被從表參照時,主表的記錄將不允許刪除,如果要刪除數據,需要先刪除從表中依賴該記錄的數據, 然後才可以刪除主表的數據。還有一種就是級聯刪除子表數據。
註意:外鍵約束的參照列,在主表中引用的只能是主鍵或唯一鍵約束的列,假定引用的主表列不是唯一的記錄, 那麽從表引用的數據就不確定記錄的位置。同一個表可以有多個外鍵約束。
創建外鍵約束:
主表
create table classes(
id int auto_increment primary key,
name varchar(20)
);
從表
create table student(
id int auto_increment,
name varchar(22),
constraint pk_id primary key(id),
classes_id int references classes(id)
);
通常先建主表,然後再建從表,這樣從表的參照引用的表才存在。
表級別創建外鍵約束:
create table student(
id int auto_increment primary key,
name varchar(25),
classes_id int,
foreign key(classes_id) references classes(id)
);
上面的創建外鍵的方法沒有指定約束名稱,系統會默認給外鍵約束分配外鍵約束名稱,命名為student_ibfk_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_ibfk_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
);
5、check
MySQL可以使用check約束,但check約束對數據驗證沒有任何作用。
create table temp(
id int auto_increment,
name varchar(20),
age int,
primary key(id),
check(age > 20)
);
上面check約束要求age必須大於20,但沒有任何作用。但是創建table的時候沒有任何錯誤或警告。
sql約束