阳光市往房和城乡规划建设局网站,wordpress调用文章调节每页数量,推广公司如何找客户,手机网站被拦截怎么解除第十三章#xff1a;约束 
13.1#xff1a;约束(constraint)概述 为什么需要约束  数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)。它是防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。 为…第十三章约束 
13.1约束(constraint)概述 为什么需要约束  数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)。它是防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。 为了保证数据的完整性SQL规范以约束的方式对表数据进行额外的条件限制。 实体完整性(Entity Integrity)域完整性(Domain Integrity)引用完整性(Referential Integrity)用户自定义完整性(User-defined Integrity)  什么是约束 约束是表级的强制规定。可以在创建表时规定约束(通过CREATE TABLE语句)或者在表创建之后通过ALTER TABLE语句规定约束。  约束的分类  根据约束数据列的限制 单列约束每个约束只约束一列多列约束每个约束可约束多列数据  根据约束的作用范围 列级约束只能作用在一个列上跟在列的定义后面。表级约束可以作用在多个列上不与列一起而是单独定义。 位置支持的约束类型是否可以起约束名列级约束列的后面语法都支持但外键没有效果不可以表级约束所有列的下面默认和非空不支持其他支持可以(主键没有效果) 根据约束起的作用 NOT NULL非空约束规定某个字段不能为空UNIQUE唯一约束规定某个字段在整个表中唯一的PRIMARY KEY主键(非空且唯一)约束FOREIGN KEY外键约束CHECK检查约束DEFAULT默认值约束   
13.2非空约束 作用 限定某个字段/某列的值不允许为空。  关键字 NOT NULL  特点 默认所有的类型的值都可以是NULL包括INT、FLOAT等数据类型。非空约束只能出现在表对象的列上只能某个列单独限定非空不能组合非空。一个表可以有很多列都分别限定了非空。空字符串不等于NULL0也不等于NULL。  添加非空约束 # 建表时
CREATE TABLE test1(
id INT NOT NULL,
last_name VARCHAR(15) NOT NULL,
email VARCHAR(25),
salary DECIMAL(10, 2)
);#建表后
ALTER TABLE test1
MODIFY email VARCHAR(25) NOT NULL;删除非空约束 ALTER TABLE test1
MODIFY email VARCHAR(25) NULL;13.3唯一约束 作用 用来限制某个字段/某列的值不能重复。【允许出现多个空值NULL】  关键字 UNIQUE  特点 同一个表可以有多个唯一约束。唯一约束可以是某一列的值唯一也可以多个列组合的值唯一。唯一性约束允许列值为空。在创建唯一约束的时候如果不给唯一约束命名就默认和列名相同。MYSQL会给唯一约束的列上默认创建一个唯一索引。  添加唯一约束  键表时添加 CREATE TABLE test2(
id INT UNIQUE, # 列级约束
last_name VARCHAR(15),
email VARCHAR(25),
salary DECIMAL(10, 2),
#表级约束
CONSTRAINT uk_test2_email UNIQUE(email)
);建表后指定唯一约束 #方式1
ALTER TABLE test2
ADD CONSTRAINT uk_test2_sal UNIQUE(salary);
#方式2
ALTER TABLE test2
MODIFY last_name VARCHAR(15) UNIQUE;复合唯一约束 CREATE TABLE USER(
id INT,
name VARCHAR(15),
password VARCHAR(25),
#表级约束
CONSTRAINT uk_user_name_pwd UNIQUE(name, password)
);删除唯一约束 添加唯一性约束的列上也会自动创建唯一索引。删除唯一约束只能通过删除唯一索引的方式删除。删除时需要指定唯一索引名唯一索引名就和唯一约束名一样。如果创建唯一约束时并未指定名称如果是单列就默认和列名相同如果是组合列那么默认和()中排在第一个的列名相同。也可以自定义唯一性约束名。 ALTER TABLE test2
DROP INDEX last_name;ALTER TABLE test2
DROP INDEX uk_test2_sal;13.4PRIMARY KEY约束 作用 用来唯一标识表中的一行记录。  关键字 primary key  特点 主键约束相当于唯一约束非空约束的组合主键约束列不允许重复也不允许出现空值。一个表最多只能有一个主键约束建立主键约束可以在列级别创建也可以在表级别上创建。主键约束对应着表中的一列或者多列(复合主键)。如果是多列组合的复合主键约束那么这些列都不允许为空值并且组合的值不允许重复。MySQL的主键名是PRIMARY就算自己命名了主键约束名也没用。当创建主键约束时系统默认会在所在的列或列组合上建立对应的主键索引(能够根据主键查询的就根据主键查询效率更高)。如果删除主键约束了主键约束对应的索引就会自动删除了。注意不要修改主键字段的值。修改了主键的值可能会破坏数据的完整性。  添加主键约束  键表时指定主键约束 # 方式一
CREATE TABLE test4(
id INT PRIMARY KEY,
last_name VARCHAR(15),
salary DECIMAL(10, 2),
email VARCHAR(25)
);# 方式二
CREATE TABLE test5(
id INT,
last_name VARCHAR(15),
salary DECIMAL(10, 2),
email VARCHAR(25),
CONSTRAINT pk_test5_id PRIMARY KEY(id) #没有必要起名字
);建表后添加主键约束 CREATE TABLE test6(
id INT,
last_name VARCHAR(15),
salary DECIMAL(10, 2),
email VARCHAR(25)
);ALTER TABLE test6
ADD PRIMARY KEY(id);复合主键 CREATE TABLE user1(
id INT,
NAME VARCHAR(15),
PASSWORD VARCHAR(25),
PRIMARY KEY (NAME, PASSWORD)
);删除主键约束 ALTER TABLE test6
DROP PRIMARY KEY;13.5自增列 作用 某个字段的值自增。  关键字 atuo_increment  特点和要求 一个表最多只能有一个自增长列。当需要产生唯一标识或顺序值时可设置自增长。自增长列约束的列必须是键列(主键列唯一键列)。自增约束的列的数据类型必须是整数类型。如果自增列指定了0和null会在当前最大值的基础上自增如果自增列手动指定了具体值直接赋值为具体值。  指定自增约束  建表是指定自增列 CREATE TABLE test7(
id INT PRIMARY KEY AUTO_INCREMENT,
last_name VARCHAR(15)
);建表后指定自增长列 CREATE TABLE test8(
id INT PRIMARY KEY,
last_name VARCHAR(15)
);ALTER TABLE test8
MODIFY id INT AUTO_INCREMENT;删除自增约束 ALTER TABLE test8
MODIFY id INT;MySQL 8.0新特性-自增变量的持久化  在MySQL 8.0之前自增主键AUTO_INCREMENT的值如果大于max(primary key)  1在MySQL重启后会重置AUTO_INCREMENTmax(primary key)  1这种现象在某些情况下会导致业务主键冲突或者其他难以发现的问题。  在MySQL 5.7系统中对于自增主键的分配规则是由InnoDB数据字典内部一个计数器来决定的而该计数器只在内存中维护并不会持久到磁盘中。当数据库重启时该计数器会被初始化。  MySQL 8.0将自增主键的计数器持久化到重做日志中。每次计数器发生改变都会将其写入重做日志中。如果数据库重启InnoDB会根据重做日志中的信息来初始化计数器的内存值。  
13.6FOREIGN KEY约束 作用 限定某个表的某个字段的引用完整性。  关键字 FOREIGN KEY  主表和从表/父表和子表 主表(父表)被引用的表被参考的表。从表(子表)引用别人的表参考别人的表。  特点 从表的外键列必须引用/参考主表的主键或唯一约束的列。在创建外键约束时如果不给外键约束命名默认名不是列名而是自动产生一个外键名也可以指定外键约束名。创建(CREATE)表时看指定外键约束的话先创建主表在创建从表。删除表时先删从表(或先删除外键约束)在删除主表。当主表的记录被从表参照时主表的记录将不允许删除如果要删除数据需要先删除从表中依赖该记录的数据然后才可以删除主表的数据。在从表中指定外键约束并且一个表可以建立多个外键约束。从表的外键列与主表被参照的列名字可以不相同但是数据类型必须一样逻辑意义一致。如果类型不一样创建子表时就会出现错误ERROR 1005(HY000): Cant create tabledatabase.tablename(errno: 150)。当创建外键约束时系统默认会在所在的列上建立对应的普通索引。但是索引名是外键的约束名。删除外键约束后必须手动删除对应的索引。  添加外键约束  建表时添加外键约束 #①先创建主表
CREATE TABLE dept1(
dept_id INT PRIMARY KEY,
dept_name VARCHAR(15)
);
#②再创建从表
CREATE TABLE emp1(
emp_id INT PRIMARY KEY AUTO_INCREMENT,
emp_name VARCHAR(15),
department_id INT,CONSTRAINT fk_emp1_dept_id FOREIGN KEY (department_id) REFERENCES dept1(dept_id)
);建表后添加外键约束 CREATE TABLE dept2(
dept_id INT PRIMARY KEY,
dept_name VARCHAR(15)
);CREATE TABLE emp2(
emp_id INT PRIMARY KEY AUTO_INCREMENT,
emp_name VARCHAR(15),
department_id INT
);ALTER TABLE emp2
ADD CONSTRAINT fk_emp2_dept_id FOREIGN KEY(department_id) REFERENCES dept2(dept_id);约束等级 Cascade方式在父表上update/delete记录时同步update/delete掉子表的匹配记录。Set null方式在父表上update/delete记录时将子表上匹配记录的列设为null但是要注意子表的外键列不能为not null。No action方式如果子表中有匹配的记录则不允许对父表对应候选键进行update/delete操作。Restrict方式同no action都是立即检查外键约束。Set default方式(在可视化工具SQLyog中可能显示空白)父表有变更时子表将外键列设置成一个默认的值但Innodb不能识别。 如果没有指定等级就相当于Restrict方式。对于外键约束最好是采用ON UPDATE CASCADE ON DELETE RESTRICT的方式。 CREATE TABLE dept(
did INT PRIMARY KEY,  #部门编号
dname VARCHAR(50)     #部门名称
);CREATE TABLE emp(
eid INT PRIMARY KEY, #员工编号
ename VARCHAR(5),    #员工姓名
deptid INT,          #员工所在的部门
#把修改操作设置为级联修改等级把删除操作设置为set null等级
FOREIGN KEY (deptid) REFERENCES dept(did) ON UPDATE CASCADE ON DELETE SET NULL
);INSERT INTO dept VALUES(1001, 教学部);
INSERT INTO dept VALUES(1002, 财务部);
INSERT INTO dept VALUES(1003, 咨询部);INSERT INTO emp VALUES(1, 张三, 1001); #在添加这条记录时要求部门表有1001部门
INSERT INTO emp VALUES(2, 李四, 1001);
INSERT INTO emp VALUES(3, 王五, 1002);UPDATE dept
SET did  1004
WHERE did  1002;DELETE FROM dept
WHERE did  1004;SELECT * FROM dept;
SELECT * FROM emp;/* dept表
--------------------
| did    |  dname     |
--------------------
| 1001   |  教学部     |
--------------------
| 1003   |  咨询部     |
--------------------
*//* emp表
--------------------------------
| eid    |  ename     |  deptid    |
--------------------------------
| 1      |  张三      |  1001      |
--------------------------------
| 2      |  李四      |  1001      |
--------------------------------
| 3      |  王五      |  null      |
--------------------------------
*/删除外键约束 ALTER TABLE emp1
DROP FOREIGN KEY fk_emp1_dept_id;开发中应用场景  如果两个表之间有关系(一对一、一对多)他们之间是否一定要建外键约束 不是。  建和不建外键约束有什么区别  建外键约束你的操作(创建表、删除表、添加、修改、删除)会受到限制从语法层面受到限制。  不建外键约束你的操作(创建表、删除表、添加、修改、删除)不受限制要保证数据的引用完整性只能依靠程序员的自觉或者是在Java程序中进行限定。  那么建和不建外建约束和查询有没有关系 没有。  说明  在MySQL里外建约束是有成本的需要消耗系统资源。对于大并发的SQL操作有可能会不适合。比如大型网站的中央数据库可能会因为外建约束的系统开销而变得非常慢。所以MySQL允许你不使用系统自带的外键约束在应用层面完成检查数据的一致性的逻辑。也就是说即使你不用外键约束也要想办法通过应用层面的附加逻辑来实现外键约束的功能确保数据的一致性。  阿里开发规范 【强制】不得使用外键与级联一切外键概念必须在应用层解决。   
13.7CHECK约束 作用 检查某个字段的值是否符合要求一般指的是值的范围。  关键字 CHECK  说明MySQL 5.7不支持  MySQL 5.7可以使用check约束但check约束对数据验证没有任何作用。添加数据时没有任何错误或警告。但是**MySQL 8.0中可以使用check约束了**。 CREATE TABLE test10(
id INT,
last_name VARCHAR(15),
salary DECIMAL(10, 2) CHECK(salary  2000)
);INSERT INTO test10
VALUES(1, Tom, 2500);#添加失败
INSERT INTO test10
VALUES(2, Tom1, 1500);SELECT * 
FROM test10;/* test10表
--------------------------------
| id     |  last_name |   salary   |
--------------------------------
| 1      |  Tom       |  2500.00   |
--------------------------------
*/13.8DEFAULT约束 作用 给某个字段/某列指定默认值一旦设置默认值在插入数据时如果此字段没有显示赋值则赋值为默认值。  关键字 DEFAULT  字段加默认值  建表时添加默认值 CREATE TABLE test11(
id INT,
last_name VARCHAR(15),
salary DECIMAL(10, 2) DEFAULT 2000
);建表后添加默认值 CREATE TABLE test12(
id INT,
last_name VARCHAR(15),
salary DECIMAL(10, 2)
);ALTER TABLE test12
MODIFY salary DECIMAL(8, 2) DEFAULT 2500;删除默认值约束 ALTER TABLE test12
MODIFY salary DECIMAL(8, 2); 文章转载自: http://www.morning.pqppj.cn.gov.cn.pqppj.cn http://www.morning.mpgfk.cn.gov.cn.mpgfk.cn http://www.morning.ljllt.cn.gov.cn.ljllt.cn http://www.morning.bnkcl.cn.gov.cn.bnkcl.cn http://www.morning.sxfmg.cn.gov.cn.sxfmg.cn http://www.morning.pjrql.cn.gov.cn.pjrql.cn http://www.morning.kdnrc.cn.gov.cn.kdnrc.cn http://www.morning.gybnk.cn.gov.cn.gybnk.cn http://www.morning.qcbhb.cn.gov.cn.qcbhb.cn http://www.morning.tclqf.cn.gov.cn.tclqf.cn http://www.morning.lkfsk.cn.gov.cn.lkfsk.cn http://www.morning.xqtqm.cn.gov.cn.xqtqm.cn http://www.morning.rfhwc.cn.gov.cn.rfhwc.cn http://www.morning.rnpnn.cn.gov.cn.rnpnn.cn http://www.morning.bhrbr.cn.gov.cn.bhrbr.cn http://www.morning.zqzzn.cn.gov.cn.zqzzn.cn http://www.morning.rnfwx.cn.gov.cn.rnfwx.cn http://www.morning.rgksz.cn.gov.cn.rgksz.cn http://www.morning.kgmkl.cn.gov.cn.kgmkl.cn http://www.morning.mdxwz.cn.gov.cn.mdxwz.cn http://www.morning.mplb.cn.gov.cn.mplb.cn http://www.morning.pqypt.cn.gov.cn.pqypt.cn http://www.morning.wzyfk.cn.gov.cn.wzyfk.cn http://www.morning.ldfcb.cn.gov.cn.ldfcb.cn http://www.morning.dyhlm.cn.gov.cn.dyhlm.cn http://www.morning.svtxeu.com.gov.cn.svtxeu.com http://www.morning.hpspr.com.gov.cn.hpspr.com http://www.morning.fhghy.cn.gov.cn.fhghy.cn http://www.morning.nptls.cn.gov.cn.nptls.cn http://www.morning.mbhdl.cn.gov.cn.mbhdl.cn http://www.morning.huihuangwh.cn.gov.cn.huihuangwh.cn http://www.morning.aowuu.com.gov.cn.aowuu.com http://www.morning.znqmh.cn.gov.cn.znqmh.cn http://www.morning.ltzkk.cn.gov.cn.ltzkk.cn http://www.morning.kpgft.cn.gov.cn.kpgft.cn http://www.morning.rrms.cn.gov.cn.rrms.cn http://www.morning.kkjlz.cn.gov.cn.kkjlz.cn http://www.morning.zbqsg.cn.gov.cn.zbqsg.cn http://www.morning.zqfjn.cn.gov.cn.zqfjn.cn http://www.morning.mpngp.cn.gov.cn.mpngp.cn http://www.morning.plqqp.cn.gov.cn.plqqp.cn http://www.morning.swimstaracademy.cn.gov.cn.swimstaracademy.cn http://www.morning.jstggt.cn.gov.cn.jstggt.cn http://www.morning.cnprt.cn.gov.cn.cnprt.cn http://www.morning.pmftz.cn.gov.cn.pmftz.cn http://www.morning.jqzns.cn.gov.cn.jqzns.cn http://www.morning.brwwr.cn.gov.cn.brwwr.cn http://www.morning.nmyrg.cn.gov.cn.nmyrg.cn http://www.morning.xjmyq.com.gov.cn.xjmyq.com http://www.morning.thntp.cn.gov.cn.thntp.cn http://www.morning.kmwsz.cn.gov.cn.kmwsz.cn http://www.morning.grpfj.cn.gov.cn.grpfj.cn http://www.morning.slkqd.cn.gov.cn.slkqd.cn http://www.morning.rycbz.cn.gov.cn.rycbz.cn http://www.morning.kpwcx.cn.gov.cn.kpwcx.cn http://www.morning.tssmk.cn.gov.cn.tssmk.cn http://www.morning.hqrr.cn.gov.cn.hqrr.cn http://www.morning.pwxkn.cn.gov.cn.pwxkn.cn http://www.morning.nlrxh.cn.gov.cn.nlrxh.cn http://www.morning.tdgwg.cn.gov.cn.tdgwg.cn http://www.morning.jfnlj.cn.gov.cn.jfnlj.cn http://www.morning.nckjk.cn.gov.cn.nckjk.cn http://www.morning.qnywy.cn.gov.cn.qnywy.cn http://www.morning.touziyou.cn.gov.cn.touziyou.cn http://www.morning.mcjxq.cn.gov.cn.mcjxq.cn http://www.morning.lhsdf.cn.gov.cn.lhsdf.cn http://www.morning.lfbsd.cn.gov.cn.lfbsd.cn http://www.morning.yrwqz.cn.gov.cn.yrwqz.cn http://www.morning.qpntn.cn.gov.cn.qpntn.cn http://www.morning.qfwfj.cn.gov.cn.qfwfj.cn http://www.morning.yyngs.cn.gov.cn.yyngs.cn http://www.morning.btcgq.cn.gov.cn.btcgq.cn http://www.morning.hrdx.cn.gov.cn.hrdx.cn http://www.morning.qgjwx.cn.gov.cn.qgjwx.cn http://www.morning.lsqxh.cn.gov.cn.lsqxh.cn http://www.morning.pbknh.cn.gov.cn.pbknh.cn http://www.morning.rqxhp.cn.gov.cn.rqxhp.cn http://www.morning.nwfxp.cn.gov.cn.nwfxp.cn http://www.morning.hwpcm.cn.gov.cn.hwpcm.cn http://www.morning.rhsr.cn.gov.cn.rhsr.cn