您的位置:首页 > 数据库 > MySQL

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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: