完整性约束
什么是完整性约束?
完整性约束是为了表的数据的正确性!如果数据不正确,那么一开始就不能添加到表中。
数据完整性约束指的是为了防止不符合规范的数据进入数据库,在用户对数据进行插入、修改、删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数据库中存储的数据正确、有效、相容。
–百度百科
主键约束
指定主键约束使用PRIMARY KEY关键字
注意:主键列的值不能为NULL,不能重复!
主键最大的特点就是可以唯一的标识一条记录
- 创建表:定义列时指定主键:
CREATE TABLE stu(
sid CHAR(6) PRIMARY KEY,
sname VARCHAR(20),
age INT,
gender VARCHAR(10)
); - 创建表:定义列之后独立指定主键:
CREATE TABLE stu(
sid CHAR(6),
sname VARCHAR(20),
age INT,
gender VARCHAR(10),
PRIMARY KEY(sid)
); - 修改表时指定主键:
ALTER TABLE stu ADD PRIMARY KEY(sid); - 删除主键(只是删除主键约束,而不会删除主键列):
ALTER TABLE stu DROP PRIMARY KEY;
主键自增长
MySQL提供了主键自动增长的功能!当主键设置为自动增长后,在没有给出主键值时,主键的值会自动生成,而且是最大主键值+1,也就不会出现重复主键的可能了。
-
创建表时设置主键自增长(主键必须是整型才可以自增长):
CREATE TABLE stu(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20),
age INT,
gender VARCHAR(10)
); -
修改表时设置主键自增长:
ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT; -
修改表时删除主键自增长:
ALTER TABLE stu CHANGE sid sid INT;
非空和唯一约束
非空(不允许该列的值为空)
NOT NULL
CREATE TABLE stu(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(10) NOT NULL,
age INT,
gender VARCHAR(10)
);
注意:如果某列被设置为非空约束!那么插入记录的时候就必须有值否则就报错!
唯一(该列的值不能重复,但可以为null值)
UNIQUE
CREATE TABLE stu(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(10) UNIQUE
);
外键约束(重点)
外键是另一张表的主键!例如员工表与部门表之间就存在关联关系,其中员工表中的部门编号字段就是外键,是相对部门表的外键。
主外键是构成表与表关联的唯一途径!
(从表引用主表,从表是依赖主表的。通常多的一方就是从表,或者说要引用主表的表就是从表)
1) 一对一:
例如person表和card表,即人和身份证。这种情况需要找出主从关系,即谁是主表,谁是从表。人可以没有身份证,但身份证必须要有人才行,所以人是主表,而身份证是从表。设计从表可以有两种方案:
- 在card表中添加外键列(相对person表),并且给外键添加唯一约束;
– 一对一(夫妻表,丈夫表)
– 从表 外键是定义在从表里的
CREATE TABLE wife(
wid INT PRIMARY KEY,
wname VARCHAR(20),
hid INT UNIQUE, – 外键 唯一
CONSTRAINT fk_wife_husband FOREIGN KEY(hid) REFERENCES husband(hid)
);
– 主表,
CREATE TABLE husband(
hid INT PRIMARY KEY,
hname VARCHAR(20)
); - 给card表的主键添加外键约束(相对person表),即card表的主键也是外键。
– 从表 外键是定义在从表里的
CREATE TABLE wife(
wid INT PRIMARY KEY,
wname VARCHAR(20),
– 不需要单独指定外键列
– 把主键作为外键
CONSTRAINT fk_wife_husband2 FOREIGN KEY(wid) REFERENCES husband(hid)
);
– 主表,
CREATE TABLE husband(
hid INT PRIMARY KEY,
hname VARCHAR(20)
);
2) 一对多(多对一):
最为常见的就是一对多!一对多和多对一,这是从哪个角度去看得出来的。emp和dept的关系,从dept来看就是一对多,而从emp的角度来看就是多对一!这种情况都是在多方创建外键!
部门表
CREATE TABLE dept(
deptno INT primary key,
dname varchar(14),
loc varchar(13)
);
员工表
CREATE TABLE emp(
empno INT primary key,
ename VARCHAR(50),
job VARCHAR(50),
mgr INT,
hiredate DATE,
sal DECIMAL(7,2),
comm DECIMAL(7,2),
deptno INT,
– 添加外键约束
CONSTRAINT fk_dept_emp FOREIGN KEY(deptno) REFERENCES dept(deptno)
) ;
移除外键约束
ALTER TABLE 表名 DROP FOREIGN KEY 约束名称
添加外键约束
ALTER TABLE 表名 ADD CONSTRAINT 约束名称 FOREIGN KEY(外键列) REFERENCE 主表(主键)
3) 多对多:
例如stu和teacher表,即一个学生可以有多个老师,而一个老师也可以有多个学生。这种情况通常需要创建中间表来处理多对多关系。例如再创建一张表stu_tea表,给出两个外键,一个相对stu表的外键,另一个相对teacher表的外键。
CREATE TABLE student(
id INT PRIMARY KEY,
`name` VARCHAR(20)
);
CREATE TABLE teacher(
id INT PRIMARY KEY,
`name` VARCHAR(20)
);
-- 建立多对多的关系
-- 通过第三张表存储关系
CREATE TABLE stu_tea(
id INT PRIMARY KEY,
sid INT, -- 外键列
tid INT, -- 外键列
CONSTRAINT fk_st_s FOREIGN KEY(sid) REFERENCES student(id),
CONSTRAINT fk_st_t FOREIGN KEY(tid) REFERENCES teacher(id)
);