常見的約束
含義:一種限制,用於限制表中的數據,爲了保證表中的數據的準確和可靠性。
常見約束分類:六大分類 重點
not null:非空,用於保證該字段的值不能爲空,比如姓名,學號等。
default:默認,用於保證該字段有默認值。比如性別
primary key:主鍵,用於保證該字段的值具有唯一性,並且非空。比如學號,員工編號。
unique:唯一,用於保證該字段的值具有唯一性,可以爲空。比如:座位號。
check:檢查約束(mysql中不支持),比如年齡,性別。
foreign key:外鍵,用於限制兩個表的關係,用於保證該字段的值必須來自於主表的關聯列,
在從表中添加外鍵約束,用於引用主表中某列的值,
比如:學生表的專業編號,員工表的部門編號,員工表的工種編號。
添加約束的時機:
一:創建表時,
二:修改表時
約束的添加分類:
列級約束:
六大約束語法都支持,但外鍵約束沒有效果。
表級約束:
除了非空,默認,其他的都支持。
primary key(主鍵)和unique(唯一)的區別
外鍵的特點 重點
一:要求在從表設置外鍵關係
二:從表的外鍵列的類型和主表的關聯列的類型要求一致或兼容,名稱無要求。
三:主表的關聯列必須是一個key(一般是主鍵或唯一)
四:插入數據時,先插入主表,再插入從表,刪除數據時,先刪除從表,再刪除主表
create table 表名(
字段名 字段類型 列級約束,
字段名 字段類型,
表級約束
);
一:創建表時添加約束
**語法:**直接在字段名或類型後面追加,約束類型即可。
1:添加列級約束
create table stuinfo(
id int primary key, #主鍵
stuName varchar(20) not null, #非空
gender char(1) check(gender='男' or gender='女'), #檢查
seat int unique, #唯一
age int default 18, #默認約束
majorId int references major(id) #外鍵
);
create table major(
id int primary key,
majorName cahrchar(20)
);
desc stuinfo;
查看sutinfo中的所有約束,包括主鍵,外鍵,唯一
show index from stuinfo;
二:添加表級約束
語法:
在各個字段的最下面
【constraint 約束名】 約束類型(字段名)
DROP TABLE
IF
EXISTS stuinfo;
CREATE TABLE stuinfo (
id INT,
stuName VARCHAR ( 25 ),
gender CHAR ( 1 ),
seat INT,
age INT,
majorId INT,
CONSTRAINT pk PRIMARY KEY ( id ),#主鍵
CONSTRAINT uq UNIQUE ( seat ),#唯一鍵
CONSTRAINT ck CHECK ( gender = '男' OR gender = '女' ),#檢查
CONSTRAINT fk_stuinfo_major FOREIGN KEY ( majorId ) REFERENCES major ( id ) #外鍵
);
CREATE TABLE stuinfo (
id INT,
stuName VARCHAR ( 25 ),
gender CHAR ( 1 ),
seat INT,
age INT,
majorId INT,
PRIMARY KEY ( id ),#主鍵
UNIQUE ( seat ),#唯一鍵
CHECK ( gender = '男' OR gender = '女' ),#檢查
FOREIGN KEY ( majorId ) REFERENCES major ( id ) #外鍵
);
SHOW INDEX FROM stuinfo;
通用的寫法:
CREATE TABLE
IF
NOT EXISTS tuinfo (
id INT PRIMARY KEY,
stuName VARCHAR ( 25 ) NOT NULL,
sex CHAR ( 1 ),
age INT DEFAULT 18,
majorId INT,
CONSTRAINT fk_tuinfo_major FOREIGN KEY ( majorId ) REFERENCES major ( id )
);
二:修改表時添加約束
語法:
1:添加的列級約束
ALTER TABLE 表名 MODIFY COLUMN 字段名 字段類型 新約束;
2:添加表級約束
ALTER TABLE 表名 ADD 【constraint 約束名】 約束類型(字段名) 【外鍵的引用】;
修改表時添加約束
DROP TABLE
IF
NOT EXISTS stuinfo;
CREATE TABLE STUINFO ( id INT, stuName VARCHAR ( 20 ), gender CHAR ( 1 ), seat INT, age INT, majorId INT );
DESC stuinfo;#添加非空約束
ALTER TABLE tuinfo MODIFY COLUMN stuname VARCHAR ( 20 ) NOT NULL;
約束練習題
添加非空約束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR ( 20 ) NOT NULL;
添加默認約束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;
添加主鍵約束
# 列級約束
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
#表級約束
ALTER TABLE stuinfo ADD PRIMARY KEY ( id );
添加唯一約束
#列級約束
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
#表級約束
ALTER TABLE stuinfo ADD UNIQUE ( seat );
添加外鍵
ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY ( majorId ) REFERENCES major ( id );
三:修改表時刪除約束
一:刪除非空約束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR ( 25 ) NULL;
刪除默認約束
ALTER TABLE stuinfo MODIFY COLUMN age INT;
刪除主鍵
ALTER TABLE stuinfo DROP PRIMARY KEY;
刪除唯一鍵
ALTER TABLE stuinfo DROP INDEX seat;
刪除外鍵
ALTER TABLE stuinfo DROP FOREIGN KEY majorId;
show index from stuinfo;
常見的約束練習
向emp2的id列中添加primary key的約束(my_emp_id_pk)
alter table emp2 modify column id int primary key;
alter table emp2 add constraint my_emp_id_pk primary key(id);
向表dept2的id列中添加primary key 約束(my_dept_id_pk)
alter table dept2 add constraint my_dept_id_pk primary key(id);
標識列:又稱爲自增長列
含義:可以不用手動的插入值,系統提供默認的序列值
標識列的特點:
一:標識列必須和主鍵搭配嗎?不一定,但要求是一個key
二:一個表可以有幾個標識列?至多一個
三:標識列的類型只能是數值型
四:標識列可以通過 set auto_increment=3;設置步長,
可以通過手動設置值,設置起始值。
創建表時設置標識列
drop table if exists tab_identity;
create table tab_identity(
id int primary key auto_increment,
name varchar(20)
);
二:修改表時設置標識列
alter table tab_identity mdify column id int primary key auto_increment;
三:修改表時刪除標識列
alter table tab_identity modify column id int;