[mysql]约束(上)
约束
道德约束,法律约束,这个约束在表里面是狭义的.
约束广义的,比如数值型你就不能录入’abc’.字符,定义了varchar(15)范围不能超过数量15.
我们这个章节要说的约束是狭义的,是具体的我们设定的约束,
为什么我们需要约束呢
我们是为了数据的精确性和可靠性,我们了为了防止数据中存在不符合语义规定的数据局和防止因为错误数据的输入输出导致错误信息而提出的.
实体完整性,我们在一个表中不能出现2条完全相同,无法区分的记录,那我们WHERE不就一定会出现2条记录,所以我们一般用主键去约束实体完整性.
域完整性,这个代表的是一个范围,年龄0-120,性别范围是男女
引用完整性:比如一个员工有所在部门,那么部门表就一定要有这个部门.所以我们输入的部门就一定要存在于部门表
用户自定义完整性,比如用户名唯一,密码不为空,部门经理的工资不能高于平均工资的5倍,
这些是我们自己设定的限制.
什么是约束
约束是表级的强制规定,
SELECT * FROM information_schema.table_constraints
WHERE table_name='employees'
#这是查看约束的代码
#非空约束
限制字段内容不能为空,
它的特点有4个,第一所有类型的值都可以是NULL,包括INT,FLOAT数据类型
第二非空约束不能组合非空,一次只能设定一个列(字段)
第三一个表可以有很多列都分别限定了非空
第四空字符串不是空,0也不是空
#3.创建表的时候添加约束
CREATE TABLE TEST_1(
id INT NOT NULL,#需要的时候才加非空
last_name VARCHAR(15) NOT NULL,
email VARCHAR(25),
salary DECIMAL(10,2));
DESC test_1
INSERT INTO test_1(id,last_name,email,salary)
VALUES(1,'chen','132@.com',3500)
INSERT INTO test_1(id,last_name,email,salary)
VALUES(1,NULL,'132@.com',3500)#这里因为NULL所以就报错了
INSERT INTO test_1(id,last_name,email,salary)
VALUES(1,'chen',NULL,3500)
INSERT INTO test_1(id,email)
VALUES(1,'123.com')#这里也是因为没有输入值,所以会导致空,报错会显示没有默认值,因为我们mysql发现没有输入会先寻找表有没有默认值,最后因为没有默认值所以报错了.
#修改表我们也会遇见这个场景,非空的也不能修改为空,比如
UPDATE test_1 SET last_name=NULL#同样报错了
#这次我们要再ALTER TABLE 时添加约束
DESC test_1
ALTER TABLE TEST_1
MODIFY email VARCHAR(15) NOT NULL
#这里由于我们刚才演示的时候给邮箱添加了一个空值,所以现在我们一定要添加的话,我们就得把邮箱修改为有值,或者直接把这个记录删除掉.
SELECT * FROM test_1
UPDATE test_1 SET email='12322.com' WHERE id =1
这次就成功把非空约束添加到email中了
如果有多条记录,只要其中有一个是空那么就不能成功.
至于如何删除#如何删除NOT NULL
ALTER TABLE TEST_1
MODIFY email VARCHAR(15)
就是刚才的代码删除notnull就可以了
唯一约束
#4唯一约束,字如其名,用于限制某个字段的值不能重复
#如何实现呢,用关键词UNIQUE
#特点,一个表可以有多个,可以多个字段唯一约束.
#4.1
CREATE TABLE TEST_2(
id INT NOT NULL UNIQUE,#需要的时候才加约束
last_name VARCHAR(15) NOT NULL , #同名的是有可能的
email VARCHAR(25), #邮箱是不是应该不一样,是的,老板可能发给2个人,那不行,所以我们再后面表级别进行约束的简历
salary DECIMAL(10,2),#工资不能唯一
#表级约束
CONSTRAINT uk_test_2_email UNIQUE(email))
这里我们可以看见我们就有两个约束了,我们可以发现,如何再字段后面建立约束,那么它的约束名称就和字段名相同,如果我们命名了,那么它的名字就是命名的名字.
为什么我们特意提到约束的名字呢,因为我们后面需要删除用的到
DESC TEST_2
INSERT INTO TEST_2(id,last_name,email,salary)
values(1,'Tom','1236@com',123)
INSERT INTO TEST_2(id,last_name,email,salary)
values(1,'Tom','1236@com',123)#这里就会报错1062 - Duplicate entry '1' for key 'test_2.i,不管是email还是id,都会导致错误.
#unique是可以为空的,而且多个空值可以
INSERT INTO TEST_2(id,last_name,email,salary)
values(2,'Tom',null,123),(3,'Tom',null,123)
#4.2在ALTER TABLE 添加UNIQUE
#方式1
ALTER TABLE TEST_2
ADD constrainT uk_salary_sal UNIQUE(salary)#要加名字就要在ADD后面UNIQUE前面加,这里如果报错的是因为salary里面有工资相同的
#方式2
ALTER TABLE test_2
MODIFY LAST_name varchar(15) UNIQUE
4.3复合的唯一约束,
这里我们要对多列进行唯一性约束
CREATE TABLE USERR(
id INT,
NAME VARCHAR(45),
password VARCHAR(15),
CONSTRAINT UK_use UNIQUE(name,password))
INSERT INTO userr(id,name,password)
values(2,'Tom','null'),(3,'Tom1','null')#这里是不会报错的,如果我们出现其中一个字段是重复的,并不会出现报错,而如果出现了2个同时相同,那么才会报错,这就是为什么叫复合约束的原因.
#我们来做一个案例
#学生表
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) #复合唯一
);#这里我们建立了一个专门的选课表,学号,课程id,课程分数,我们的复合唯一是对张三来说,mysql这个课和学号应该是复合唯一的,毕竟学号相同,课程可以不唯一,课程相同,学号不能唯一
insert into student values(1,'张三','13710011002','101223199012015623');#成功
insert into student values(2,'李四','13710011003','101223199012015624');#成功
insert into course values(1001,'Java'),(1002,'MySQL');
insert into student_course values
(1, 1, 1001, 89),
(2, 1, 1002, 90),
(3, 2, 1001, 88),
(4, 2, 1002, 56);#成功
insert into student_course values (5, 1, 1001, 88);#失败,失败的原因就是因为违背的复合约束的原因
#4.4删除唯一约束,
添加唯一性约束的列上也会自动的简历唯一索引
如果要删除唯一约束只能通过删除唯一索引的方式删除,
删除的时候需要指定唯一约束的名字删除,唯一索引和唯一约束一样
如果是直接加的唯一约束,列级,那就是列名,复合唯一约束和唯一约束,那么它的名字就是我们设定的名字,没有设定名字那么它的名字就是第一个名字
如何删除唯一索引
ALTER TABLE USERR
DROP INDEX UK_use
#需要使用删除索引的方法删除约束