前言
約束:限制,限制我們表中的數據,保證添加到數據表中的數據準確和可靠性!凡事不符合約束的數據,插入時就會失敗,插入不進去的!
比如:學生信息表中,學號就會約束不可重復!
1.約束基本概念
1.1.約束的分類:
- not null:非空約束,保證值不能為空
- default:默認約束,保證字段會有默認值,即時沒有插入值,都會有默認值。
-
primary key:主鍵約束,同時保證
唯一性
和非空
- unique:唯一,保證唯一性但是可以為空
- check:檢查性約束【MySQL不支持,語法不報錯,但無效】
-
foreign key:外鍵約束,用于限制兩個表的關系,保證從表該字段的值必須來自于
主表相關聯的字段的值,不能無中生有!
比如:員工信息表中的"部門編號"的值,就必須有外鍵約束。
1.2.添加約束的時期:
創建表的時候
修改表的時候
1.3.約束的添加分類:
1.3.1列級約束
6種約束可以寫,語法都支持,不報錯,但外鍵約束寫了等于白寫
1.3.2表級約束
not null 非空、default默認不支持,其他都可以!
DROP TABLE IF EXISTS students;
CREATE TABLE students(
id INT PRIMARY KEY,#主鍵約束
s_name VARCHAR(10) NOT NULL,#非空約束
s_sex CHAR(1) NOT NULL DEFAULT '女',
s_birthday DATE ,
c_id INT REFERENCES courses(id),#外鍵約束,不生效
#表級約束
#CONSTRAINT pk PRIMARY KEY(id),
#CONSTRAINT uq UNIQUE(s_name),
CONSTRAINT fk_students_courses FOREIGN KEY(c_id) REFERENCES courses(id)
);
SHOW INDEX FROM students;
總結一下表級約束但語法:
【CONSTRAINT 約束名字】約束類型(字段名稱) 【額外但東西,如外鍵】
2.約束詳細:
2.1一般情況下MySQl的約束規范:
主鍵、非空、唯一性,默認等這些寫在列級
外鍵約束寫在表級
CREATE TABLE courses(
id INT PRIMARY KEY,
c_name VARCHAR(20) NOT NULL
);
2.2.主鍵和唯一性的區別:
2.2.1 主鍵(primary key)約束:同時保證唯一和非空
在同一個表中主鍵只能有一個在同一個表中可以將多個字段組合成一個主鍵(不推薦)
CONSTRAINT pk PRIMARY KEY(id,s_name),id和s_name組合起來成表的一個主鍵
2.2.2 唯一(unique)約束:
保證唯一但可以為空
在同一個表中唯一約束可有很多個
在同一個表中可以將多個字段組合成一個唯一但約束(不推薦)
2.3 外鍵的特點:
- 要求從表上設置外鍵約束
- 從表上的列和主表上的對應但關系列但數據類型必須一致,含義意義一致
- 主表中的關聯列必須是一個key(一般是主鍵,很少時候也可以是唯一鍵)
- 插入數據時,先插入主表,再插入從表,刪除的時候,先刪除從表記錄,再刪除主表記錄
DROP TABLE IF EXISTS students;
CREATE TABLE students(
id INT PRIMARY KEY,#主鍵約束
s_name VARCHAR(10) NOT NULL,#非空約束
s_sex CHAR(1) NOT NULL DEFAULT '女',
s_age INT(3),
s_birthday DATE ,
s_seat INT(3) ,
c_id INT REFERENCES courses(id),#外鍵約束,不生效
UNIQUE KEY s_seat (s_seat)
#表級約束
#CONSTRAINT pk PRIMARY KEY(id),
#CONSTRAINT uq UNIQUE(s_name),
CONSTRAINT fk_students_courses FOREIGN KEY(c_id) REFERENCES courses(id)
);
SHOW INDEX FROM students;
總結:表級約束但語法
【CONSTRAINT 約束名字】約束類型(字段名稱) 【額外的東西,如外鍵】
CREATE TABLE courses(
id INT PRIMARY KEY,
c_name VARCHAR(20) NOT NULL
);
3.修改表時添加和刪除約束
1.非空約束
ALTER TABLE students MODIFY COLUMN s_name VARCHAR(20) NOT NULL; #添加
DESC students;
ALTER TABLE students MODIFY COLUMN s_name VARCHAR(20) ; #刪除
DESC students;
2.添加默認約束
ALTER TABLE students MODIFY COLUMN s_age int DEFAULT 18;
DESC students;
ALTER TABLE students MODIFY COLUMN s_age int;
DESC students;
3.添加主鍵
ALTER TABLE students MODIFY COLUMN id int PRIMARY KEY;
DESC students;
ALTER TABLE students MODIFY COLUMN id int ;#刪除不掉主鍵
ALTER TABLE students DROP PRIMARY key;#刪除主鍵
DESC students;
4.添加唯一鍵
ALTER TABLE students MODIFY COLUMN s_seat int UNIQUE;#添加
DESC students;
ALTER TABLE students DROP KEY s_seat;#刪除
DESC students;
5.外鍵
ALTER TABLE students ADD FOREIGN KEY(c_id) REFERENCES courses(id); #添加
DESC students;
SHOW INDEX FROM students;
select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME='students'; #查找鍵名主鍵外鍵名
ALTER TABLE students DROP FOREIGN KEY students_ibfk_1; #刪除
DESC students;
4.標識列
有自增長列,可以不用插入值,MySQl自動提供默認的序列值。
創建表的時候添加自增長列:
DROP TABLE IF EXISTS t_identity;
CREATE TABLE t_identity(
id int PRIMARY key AUTO_INCREMENT,
`name` VARCHAR(20)
);
有了自增長列,我們添加數據記錄就可以:
INSERT INTO t_identity VALUES(null,'張三');
INSERT INTO t_identity VALUES(null,'李四');
INSERT INTO t_identity VALUES(null,'王二');
INSERT INTO t_identity VALUES(null,'王新');
INSERT INTO t_identity(name) VALUES(null,'王新');
修改表的時候添加自增長列:
ALTER TABLE t_identity MODIFY COLUMN id int AUTO_INCREMENT;
刪除自增長
ALTER TABLE t_identity MODIFY COLUMN id int ;
總結:
- 自增長列必須和鍵(一般是主鍵)搭配
- 一個表中有且只能有一個自增長列
- 自增長列的類型只能數值型,一般情況用int
- 自增長列可以設置步長( set AUTO_INCREMENT_INCREMENT=3;)也可以手動插入一個數值改變起始值。