前言
約束:限制,限制我們表中的數(shù)據(jù),保證添加到數(shù)據(jù)表中的數(shù)據(jù)準(zhǔn)確和可靠性!凡事不符合約束的數(shù)據(jù),插入時(shí)就會(huì)失敗,插入不進(jìn)去的!
比如:學(xué)生信息表中,學(xué)號(hào)就會(huì)約束不可重復(fù)!
1.約束基本概念
1.1.約束的分類:
- not null:非空約束,保證值不能為空
- default:默認(rèn)約束,保證字段會(huì)有默認(rèn)值,即時(shí)沒有插入值,都會(huì)有默認(rèn)值。
-
primary key:主鍵約束,同時(shí)保證
唯一性和非空 - unique:唯一,保證唯一性但是可以為空
- check:檢查性約束【MySQL不支持,語法不報(bào)錯(cuò),但無效】
-
foreign key:外鍵約束,用于限制兩個(gè)表的關(guān)系,保證從表該字段的值必須來自于
主表相關(guān)聯(lián)的字段的值,不能無中生有!
比如:員工信息表中的"部門編號(hào)"的值,就必須有外鍵約束。
1.2.添加約束的時(shí)期:
創(chuàng)建表的時(shí)候
修改表的時(shí)候
1.3.約束的添加分類:
1.3.1列級(jí)約束
6種約束可以寫,語法都支持,不報(bào)錯(cuò),但外鍵約束寫了等于白寫
1.3.2表級(jí)約束
not null 非空、default默認(rèn)不支持,其他都可以!
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),#外鍵約束,不生效
#表級(jí)約束
#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;
總結(jié)一下表級(jí)約束但語法:
【CONSTRAINT 約束名字】約束類型(字段名稱) 【額外但東西,如外鍵】
2.約束詳細(xì):
2.1一般情況下MySQl的約束規(guī)范:
主鍵、非空、唯一性,默認(rèn)等這些寫在列級(jí)
外鍵約束寫在表級(jí)
CREATE TABLE courses(
id INT PRIMARY KEY,
c_name VARCHAR(20) NOT NULL
);
2.2.主鍵和唯一性的區(qū)別:
2.2.1 主鍵(primary key)約束:同時(shí)保證唯一和非空
在同一個(gè)表中主鍵只能有一個(gè)在同一個(gè)表中可以將多個(gè)字段組合成一個(gè)主鍵(不推薦)
CONSTRAINT pk PRIMARY KEY(id,s_name),id和s_name組合起來成表的一個(gè)主鍵
2.2.2 唯一(unique)約束:
保證唯一但可以為空
在同一個(gè)表中唯一約束可有很多個(gè)
在同一個(gè)表中可以將多個(gè)字段組合成一個(gè)唯一但約束(不推薦)
2.3 外鍵的特點(diǎn):
- 要求從表上設(shè)置外鍵約束
- 從表上的列和主表上的對(duì)應(yīng)但關(guān)系列但數(shù)據(jù)類型必須一致,含義意義一致
- 主表中的關(guān)聯(lián)列必須是一個(gè)key(一般是主鍵,很少時(shí)候也可以是唯一鍵)
- 插入數(shù)據(jù)時(shí),先插入主表,再插入從表,刪除的時(shí)候,先刪除從表記錄,再刪除主表記錄
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)
#表級(jí)約束
#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;
總結(jié):表級(jí)約束但語法
【CONSTRAINT 約束名字】約束類型(字段名稱) 【額外的東西,如外鍵】
CREATE TABLE courses(
id INT PRIMARY KEY,
c_name VARCHAR(20) NOT NULL
);
3.修改表時(shí)添加和刪除約束
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.添加默認(rèn)約束
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.標(biāo)識(shí)列
有自增長列,可以不用插入值,MySQl自動(dòng)提供默認(rèn)的序列值。
創(chuàng)建表的時(shí)候添加自增長列:
DROP TABLE IF EXISTS t_identity;
CREATE TABLE t_identity(
id int PRIMARY key AUTO_INCREMENT,
`name` VARCHAR(20)
);
有了自增長列,我們添加數(shù)據(jù)記錄就可以:
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,'王新');
修改表的時(shí)候添加自增長列:
ALTER TABLE t_identity MODIFY COLUMN id int AUTO_INCREMENT;
刪除自增長
ALTER TABLE t_identity MODIFY COLUMN id int ;
總結(jié):
- 自增長列必須和鍵(一般是主鍵)搭配
- 一個(gè)表中有且只能有一個(gè)自增長列
- 自增長列的類型只能數(shù)值型,一般情況用int
- 自增長列可以設(shè)置步長( set AUTO_INCREMENT_INCREMENT=3;)也可以手動(dòng)插入一個(gè)數(shù)值改變起始值。