约束(constraint):
1. 数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)。
它是防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作
或错误信息而提出的。
2. 可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后
通过 ALTER TABLE 语句规定 约束。
#约束
/*
为什么需要约束 :为了保证数据的完整性
什么叫约束:对表中字段的限制
约束的分类:1.约束的字段的个数: ①单列约束 ②多列约束
2.约束的作用范围:
列级约束:将此约束声明对应字段的后面
表级约束:在表中所有字段都声明完,在所有字段的后面声明的约束。
3.约束的作用(功能)
① not null (非空约束)
②unique (唯一性约束)
③primary key (主键约束)
④foreign key (外键约束)
⑤check(检查约束)注意: MySQL不支持check约束,但可以使用check约束,而没有任何效果
⑥default (默认值约束)
4.如何添加/删除约束: ALTER TABLE 时增加约束,删除约束
*/
#information_schema数据库名(系统库)
#table_constraints表名称(专门存储各个表的约束)查询约束
SELECT * FROM information_schema.table_constraints
WHERE table_name = 'employees';
-
非空约束:
# 非空约束 NOT NULL
#在CREATE TABLE 时添加约束
CREATE TABLE test1(
id INT NOT NULL,
last_name VARCHAR (15) NOT NULL,
email VARCHAR (25),
salary DECIMAL (10,2)
);
DESC test1;
INSERT INTO test1(id,last_name,email,salary)
VALUES (1,'Tom','[email protected]',8600);
INSERT INTO test1(id,last_name,email,salary)
VALUES (2,NULL,'[email protected]',8600); #报错
INSERT INTO test1(id,last_name,email,salary)
VALUES (NULL,'jerry','[email protected]',8600); #报错
INSERT INTO test1(id,email)
VALUES (2,'[email protected]'); #报错
UPDATE test1
SET last_name=NULL #报错,修改不了
WHERE id=1;
SELECT * FROM test1
#在ALTER TABLE 时添加约束
DESC test1;
ALTER TABLE test1 #如果email有值就能修改成功,如果为null 就不行
MODIFY email VARCHAR (25) NOT NULL;
#在ALTER TABLE 时删除约束
ALTER TABLE test1
MODIFY email VARCHAR (25) NULL;
-
唯一性约束:
关键字: UNIQUE
用来限制某个字段/某列的值不能重复。
#unique (唯一性约束)
#在CREATE TABLE 时添加约束
CREATE TABLE test2(
id INT UNIQUE, #列级约束
last_name VARCHAR (15),
email VARCHAR (25) ,
salary DECIMAL (10,2),
#表级约束 CONSTRAINT uk_test2_email 也可以不用,但没有约束名
CONSTRAINT uk_test2_email UNIQUE (email)
);
#在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同。
DESC test2;
INSERT INTO test2(id,last_name,email,salary)
VALUES (1,'Tom','[email protected]',7800);
#错误:
INSERT INTO test2(id,last_name,email,salary)
VALUES (1,'Tom1','[email protected]',7800);
#错误:
INSERT INTO test2(id,last_name,email,salary)
VALUES (2,'Tom1','[email protected]',7800);
#可以向声明为unique 的字段上添加null值 而且可以多次添加null
INSERT INTO test2(id,last_name,email,salary)
VALUES (2,'Tom1','NULL',7800);
SELECT * FROM test2
INSERT INTO test2(id,last_name,email,salary)
VALUES (3,'Tom2',NULL,7800);
SELECT * FROM test2
#在ALTER TABLE 时添加约束
DESC test2;
UPDATE test2
SET salary=00
WHERE id=3; #因为数据里面有两个相同的数据了,为了能够添加约束成功,把数据改成不同的
#方式1
ALTER TABLE test2
ADD CONSTRAINT uk_test2_sal UNIQUE(salary);
#方式2
ALTER TABLE test2
MODIFY last_name VARCHAR(15) UNIQUE;
关于复合唯一约束:
#学生表
create table student(
sid int, #学号
sname varchar(20), #姓名
tel char(11) unique key, #电话
cardid char(18) unique key #身份证号
);
#课程表
create table course(
cid int, #课程编号
cname varchar(20) #课程名称
);
#选课表
create table student_course(
id int,
sid int,
cid int,
score int,
unique key(sid,cid) #复合唯一
);
insert into student
values(1,'张三','13710011002','101223199012015623');#成功
insert into student
values(2,'李四','13710011003','101223199012015624');#成功
insert into course
values(1001,'Java'),(1002,'MySQL');#成功
select * from student;
insert into student_course
values (1, 1, 1001, 89),
(2, 1, 1002, 90),
(3, 2, 1001, 88),
(4, 2, 1002, 56);#成功
删除唯一约束:
#删除唯一性约束
/*
添加唯一性约束的列上也会自动创建唯一索引。
删除唯一约束只能通过删除唯一索引的方式删除。
删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样。
如果创建唯一约束时未指定名称,如果是单列,就默认和列名相同;如果是组合列,
那么默认和()中排在第一个的列名相同。也可以自定义唯一性约束名。
*/
DESC test2;
#如何删除唯一性索引
ALTER TABLE test2
DROP INDEX last_name;
标签:test2,name,constraint,约束,id,TABLE,email From: https://www.cnblogs.com/zjwcoblogs/p/16592567.html