MySQL数据约束
2017-03-16 13:54
218 查看
-- ************数据约束******************** -- ***1.默认值 -- 作用: 当用户对使用默认值的字段不插入值的时候,就使用默认值。 -- 注意:1)默认值字段插入null时,会自动插入默认值。 2)默认值字段可以插入null值也可以插入非null值。 CREATE TABLE goods( id INT, NAME VARCHAR(20), address VARCHAR(20) DEFAULT "中国" ); INSERT INTO goods VALUES(1, "mac笔记本", "美国");-- 注意这里插入的是当前值(美国) INSERT INTO goods VALUES(1, "李宁运动鞋", NULL);-- 注意这里插入的是默认值(中国) INSERT INTO goods VALUES(1, "安踏运动鞋", "");-- 注意这里插入的是空字符串("") INSERT INTO goods(id, NAME) VALUES(1, "lenovo笔记本");-- 注意这里插入的是默认值(中国) -- ***2.非空 -- 作用:限制字段必须赋值 -- 注意:1)非空字符必须赋值。2)非空字符不能赋null CREATE TABLE goods( id INT, NAME VARCHAR(20), price DOUBLE NOT NULL, -- 非空 address VARCHAR(20) NOT NULL -- 非空 ); DESC goods; INSERT INTO goods(id, NAME) VALUES(1, "苹果"); INSERT INTO goods(id, NAME) VALUES(3, "香蕉");-- 工具会自动给插入一个0值,和“”空字符串 INSERT INTO goods VALUES(1, "mac笔记本", 5555.555); INSERT INTO goods VALUES(1, "mac笔记本", NULL); -- 无法插入null INSERT INTO goods VALUES(1, "lenovo笔记本", 4999.98, "中国" ); -- ***3.唯一 -- 作用:限制字段的值不能重复 -- 注意:1)唯一字段可以插入null。 2)唯一字段可以插入多个null CREATE TABLE goods( id INT UNIQUE, -- 唯一 NAME VARCHAR(20) ); INSERT INTO goods VALUES(1, "苹果"); INSERT INTO goods VALUES(1, "梨子"); -- 报错:Duplicate entry '1' for key 'id' INSERT INTO goods VALUES(2, "梨子"); -- ***4.主键 -- 作用:非空+唯一 -- 注意: -- 1)通常情况下,每张表都会设置一个主键的字段,用于标记表中的每条的唯一性。 -- 2)建议不要选择表的业务包含的字段作为主键,建议给每张表独立设计一个非业务含义的id字段。 CREATE TABLE goods( id INT PRIMARY KEY, NAME VARCHAR(20) ); INSERT INTO goods VALUES(1, "火龙果"); INSERT INTO goods VALUES(1, "香蕉"); -- 报错:Duplicate entry '1' for key 'PRIMARY' INSERT INTO goods(NAME) VALUES("圣女果"); -- 工具自动补入0值。但是在dos界面下报错:Field 'id' doesn't have a default value INSERT INTO goods(NAME) VALUES("圣女果"); -- 报错:Duplicate entry '0' for key 'PRIMARY' INSERT INTO goods VALUES(NULL, "柿子"); -- 报错:Column 'id' cannot be null -- ***5.自增长 -- 作用:自动的递增 -- 注意: 1) int(4),zerofill不满位数自动填0 2)delete和truncate对自增长的影响。 CREATE TABLE goods( id INT(4) ZEROFILL PRIMARY KEY AUTO_INCREMENT, -- 自增长,从0开始(1,2,3,4,5...)。 int(4),zerofill不满位数自动填0 NAME VARCHAR(20) ); INSERT INTO goods VALUES("茄子"); -- 虽然为自增长,但是字段数得匹配完整,前面应该加上null。报错:Column count doesn't match value count at row 1 INSERT INTO goods VALUES(NULL, "茄子"); INSERT INTO goods(NAME) VALUES("黄瓜"); DELETE FROM goods WHERE id=15; -- delete 不能影响自增长约束 TRUNCATE TABLE goods; -- truncate 可以影响自增长约束 -- ***6.外键约束 -- 作用:约束两种表的数据 /* 出现两种表的情况: 解决数据冗余高问题: 独立出一张表 例如: 员工表 和 部门表 问题出现:在插入员工表数据的时候,员工表的部门ID字段可以随便插入! 使用外键约束:约束插入员工表的部门ID字段值 解决办法: 在员工表的部门ID字段添加一个外键约束 注意: 1)被约束的表称为副表,约束别人的表称为主表,外键设置在副表上的!!! 2)主表的参考字段通用为主键! 3)添加数据: 先添加主表,再添加副表 4)修改数据: 先修改副表,再修改主表 5)删除数据: 先删除副表,再删除主表 单独删除外键的方法:alter table 表名 drop foreign key 外键名; -- 此方法用在表无法删除时,先单独删除外键 */ -- 部门表(主表) CREATE TABLE dept( id INT PRIMARY KEY, deptName VARCHAR(20) -- 部门名称 ); INSERT INTO dept VALUES(1, "软件开发部"); INSERT INTO dept VALUES(2, "软件维护部"); INSERT INTO dept VALUES(3, "软件销售部"); -- emp员工表(副表/从表) CREATE TABLE emp( id INT PRIMARY KEY, -- id empName VARCHAR(20), -- 员工姓名 deptId INT, -- 部门名称改成部门id -- 声明一个外键约束 CONSTRAINT emp_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) -- 外键名称 外键 参考表(参考字段) ); INSERT INTO emp VALUES(1, "木丁西", 1); INSERT INTO emp VALUES (2,"刘先森", 2); INSERT INTO emp VALUES (3,"张馨予", 2); INSERT INTO emp VALUES (4,"小龙女", 2); INSERT INTO emp VALUES (5,"这条数据能插入吗", 4); -- 报错:Cannot add or update a child row: a foreign key constraint fails (`mydb`.`emp`, CONSTRAINT `emp_dept_fk` FOREIGN KEY (`deptId`) REFERENCES `dept` (`id`)) INSERT INTO emp VALUES (6,"吴莫愁", 1); UPDATE dept SET id=2 WHERE id= 4; UPDATE emp SET deptId=2 WHERE id = 2; DELETE FROM dept WHERE id =2; DELETE FROM emp WHERE id =2; -- ***7.级联操作 -- ON UPDATE CASCADE级联修改 on delete cascade级联删除 -- 注意:级联必须在外键基础上 /* 问题:当有了外键约束的时候,必须先修改或删除副表中的所有关联数据,才能修改或删除主表! 但是,我们希望直接修改或删除主表数据,从而影响副表数据。可以使用级联操作实现!!! */ CREATE TABLE emp( id INT PRIMARY KEY, -- id empName VARCHAR(20), -- 员工姓名 deptId INT, -- 部门名称改成部门id -- 声明一个外键约束 -- ON UPDATE CASCADE级联修改 on delete cascade级联删除 CONSTRAINT emp_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE -- 外键名称 外键 参考表(参考字段) ); -- 级联操作(修改) -- 直接修改部门 UPDATE dept SET id=2 WHERE id=3; -- 部门修改了,员工表也同时更改了 -- 级联操作(删除) -- 直接删除部门 DELETE FROM dept WHERE id=2; -- 部门删除了,员工表也同时删除了 DESC emp; SELECT * FROM emp; SELECT * FROM dept; DROP TABLE emp;
相关文章推荐
- MySQL数据表的基本操作一:创建表与表约束
- mysql数据完整性和约束
- 怎么删除有外键约束的MySQL表中的数据
- MYSQL中约束及修改数据表
- MySQL学习笔记3:约束以及修改数据表
- mysql导入数据时的外键约束问题
- mysql基础---数据约束(七)
- mysql数据完整性和约束
- MySQL入门——修改数据表5:给指定表的指定字段添加外键约束
- MySQL (2)约束 - 数据的完整性
- MySQL 添加外键约束,不检查现有数据
- mysql 基本知识--约束以及修改数据表
- MySQL所支持的数据类型与表字段约束类型的学习教程
- mysql 数据库中 常用数据类型,约束
- MySQL数据约束
- mysql中约束的划分,添加和删除各种字段约束和对数据表的更名
- MySQL所支持的数据类型与表字段约束类型的学习教程
- MySQL学习笔记--2数据表约束
- MySQL基础三之约束以及修改数据表
- MySQL学习笔记 约束以及修改数据表