为什么
保证数据完整性
a,实体完整性,如:同一个表中不存在无法区分的,两条完全相同的记录
b,域完整性,如:年龄范围(0,100)
c,引用完整性,如:外连接查找客户地址,连接的表里必须有客户地址
d,用户自定义完整性,如:用户名唯一,密码不能为空
是什么
对表中字段的限制
表级的强制规定,在创建表时(CREATE TABLE)/创建表后(ALTER TABLE)规定约束
分类
A,根据约束列的限制(约束字段的个数)
单列约束:每个约束只约束一个列
多列约束:每个月书约束多个列
B,根据约束的作用范围(作用范围)
列级约束:作用在一个列上(在字段的后面声明)
表级约束:作用在一个表上(所有字段都声明完后,在所有字段后面,声明约束)
C,根据约束的作用或功能
1,NOT NULL 非空约束
2,UNIQUE 唯一性约束
3,PRIMARY KEY 主键约束
4,FOREIGN 外键约束
5,CHECK 检查约束
6,DEFAULT 默认值约束
1,NOT NULL 非空约束
A,作用:不允许为空
B,特点
1,默认
2,只能某个列单独限制非空
3,一个表可以有很多列限定非空
4,空字符串不等于NULL,0不等于NULL
C,添加
CREATE DATABASE dbtest2 ;
USE dbtest2 ;
1,建表时声明
CREATE TABLE test1(
id INT NOT NULL,
last_name VARCHAR(15) NOT NULL,
email VARCHAR(25),
salary DECIMAL(10,2) NOT NULL
);
DESC test1;
INSERT INTO test1(id,last_name,email,salary)
VALUES(123,'TOM','TOM@gmail.com',5000);
错误,因为其他字段没有输入默认为null
INSERT INTO test1(id,email)
VALUES(123,'TOM@gmail.com');
2,建表后声明
方法一
UPDATE test1
SET email = NULL
WHERE id = 1 ;
方法二
ALTER TABLE test1
MODIFY email VARCHAR(25) NOT NULL;
D,删除
ALTER TABLE test1
MODIFY NAME VARCHAR(25) DEFAULT 'TOM' NULL;
2,UNIQUE 唯一性约束
A,允许出现多个空值
B,特点
1,一个表可以有多个唯一约束
2,可以是某个列的值唯一,也可以是多个列组合的值唯一
3,允许列值为空
4,如果不给唯一约束命名,默认和列名相同
5,MYSQL会给唯一约束的列,默认创建一个唯一索引
C,添加
CREATE TABLE test2(
id INT UNIQUE,列级约束
last_name VARCHAR(15) UNIQUE,
email VARCHAR(25),
salary DECIMAL(10,2),表级约束
CONSTRAINT UK_test2_email UNIQUE(email)
);
DESC test2;
方法一
INSERT INTO test2(id,last_name,email,salary)
VALUES(2,'TOM',NULL,4600);
方法二
ALTER TABLE test2
ADD CONSTRAINT uk_test2_sal UNIQUE(salary);
方法三
ALTER TABLE test2
MODIFY last_name VARCHAR(15) UNIQUE;
D,复合唯一性约束
CREATE TABLE test_user(
id INT,
`NAME` VARCHAR(15),
`PASSWORD` VARCHAR(25),
CONSTRAINT uk_user_name_pwd UNIQUE(`NAME`,`PASSWORD`));
name和password不完全一样就不会报错
INSERT INTO test_user
VALUES(1,'TOM','ABC');
INSERT INTO test_user
VALUES(1,'JERRY','ABC');
E,删除唯一性约束
1,添加唯一性约束时,系统会自动创建唯一索引
2,唯一性约束如果是单列,索引名等于列名
3,唯一性约束只能通过唯一索引来删除
ALTER TABLE test-user
DROP INDEX uk_name_pwd;
3,PRIMARY KEY 主键约束
A,作用:用来唯一标识表中的一行记录
B,特点
1,主键约束相当于,唯一性约束加上非空约束的组合,不允许重复,也不允许出现空值
2,多列组合的复合主键约束中,列不能为NULL,且不能重复
3,主键约束对应表中的一列或多列
4,创建主键约束时,系统会在所在的列或列组合上建立对应的主键索引
5,MYSQL的主键名总是PRIMARY
6,一个表只有一个主键约束
7,修改了逐渐的值,可能会破坏数据完整性
C,添加
CREATE TABLE test_primary(
id INT PRIMARY KEY,
last_name VARCHAR(15),
salary DECIMAL(10,2),
email VARCHAR(25)#CONSTRAINT PK_TEST_ID PRIMARY KEY(id)
);
INSERT INTO test_primary(id,last_name,salary,email)
VALUES(2,'TOM',4600,'123@gmail.com');