数据约束

  • 什么是数据约束?

       对用户操作表的数据进行约束。

 

  • 默认值

       作用:当用户对使用默认值的字段不插入值的时候,就是用默认值。

       

CREATE TABLE student(
	id INT,
	NAME VARCHAR(20),
	address VARCHAR(20) DEFAULT '广州天河'		-- 默认值
)
-- 当字段没有插入值时,mysql自动给该字段分配默认值
INSERT INTO student(id,NAME) VALUES(1,'张三')
-- 注意,默认值的字段允许为null
INSERT INTO student(id,NAME,address) VALUES(2,'李四',NULL);
INSERT INTO student(id,NAME,address) VALUES(3,'王五','广州番禺');

  注意: 1)对默认值字段插入null值是可以的

           2)对默认值字段可以插入非null

 

  • 非空

       作用:限制字段必须赋值

CREATE TABLE student(
	id INT,
	NAME VARCHAR(20),
	gender VARCHAR(2) NOT NULL     -- 非空
)

1.非空字段必须赋值
mysql> insert into student(id,name) values('1','张三');
ERROR 1364 (HY000): Field 'gender' doesn't have a default value

2.非空字符不能插入null值
INSERT INTO student(id,NAME,gender) VALUES(2,'李四',NULL);
错误码: 1048
Column 'gender' cannot be null

  • 唯一

      限制字段必须赋值

CREATE TABLE student(
	id INT UNIQUE,	-- 唯一
	NAME VARCHAR(20)

)

INSERT INTO student(id,NAME) VALUES(1,'zs')
INSERT INTO student(id,NAME) VALUES(1,'lisi')
错误码: 1062
Duplicate entry '1' for key 'id'

//唯一字段可以插入null值,且可以存在多个null值
insert into student(name) values('王五');
insert into student(name) values('赵六');
  • 主键(非空+唯一)

       作用:非空+唯一

      

注意:
    1.通常情况下,每张表都会设置一个主键字段,用于标记表中每条记录的唯一性。
    2.建议不要选择包含业务含义的字段作为主键,建议给每张表独立设计一个非业务含义的id字段。

CREATE TABLE student(
	id INT PRIMARY KEY,	-- 主键
	NAME VARCHAR(20)
)

//插入重复数据时,不允许重复
INSERT INTO student(id,NAME) VALUES(1,'zs')
INSERT INTO student(id,NAME) VALUES(1,'lisi')
错误码: 1062
DUPLICATE entry '1' FOR KEY 'PRIMARY'

//插入空时,不允许非空
INSERT INTO student(NAME) VALUES('lisi');
mysql> INSERT INTO student(NAME) VALUES('lisi');
ERROR 1364 (HY000): FIELD 'id' doesn't have a default value

//插入null时,不允许为null
mysql> insert into student(id,name) values(null,'lisi');
ERROR 1048 (23000): Column 'id' cannot be null

  • 自增长

       作用:自动递增

CREATE TABLE student(
	id INT(4) ZEROFILL PRIMARY KEY AUTO_INCREMENT,	-- 主键4个整数长度,且自增长 ZEROFILL 零填充
	NAME VARCHAR(20)
)

-- 自增长字段可以不赋值没自动递增
INSERT INTO student(NAME) VALUES('张三');
INSERT INTO student(NAME) VALUES('李四');
INSERT INTO student(NAME) VALUES('王五');

-- 不能影响自增长约束
DELETE FROM student

-- 可以影响自增长约束
TRUNCATE TABLE student
  •  外键:

       作用:约束两张表的数据。

       被约束的表(employee)我们通常叫:副表或从表  

       约束其他表的该表或被参考的表,我们通常叫做:主表

      外键通常设置在副表上,主表的参考字段通常为主键

      当有外键约束,添加数据的顺序,先添加主表,再添加副表数据。

      当有外键约束,修改数据的顺序,先修改副表数据(暂时移动至合法部门),再修改主表数据

      当有外键约束,删除数据的顺序,先删除副表数据,在删除主表数据

      级联操作:当有了外键约束的时候,必须先修改或删除副表中所有关联的数据,才能修改或删除主表!

                        但是,我们希望直接修改或删除主表数据,从而影响副表相应的数据。

     级联修改: ON UPDATE CASCADED   级联更新:  ON DELETE CASCADED

     建表时增加级联操作

CREATE TABLE employee(
	id INT PRIMARY KEY,
	empName VARCHAR(20),
	deptId INT -- 把部门名称改为部门ID
	-- 声明一个外键约束
	CONSTRAINT employee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ON UPDATE CASCADED ON DELETE CASCADE 
	-- CONSTRAINT 外键名称                 外键字段             参考表(参考表字段)
)

      

出现两张表的情况下:
    解决数据冗余高的问题,独立出一张表
    例如: 员工表   和  部门表

问题出现:在插入员工表数据的时候,员工表的部门ID字段可以随便插入,但部门表却没有该部门

使用外键约束:约束插入员工表的部门ID字段值

解决办法:在员工表的部门ID字段上添加一个外键约束


1.当前的员工表 及 数据
CREATE TABLE employee(
	id INT(4) PRIMARY KEY,
	empName VARCHAR(20),
	deptName VARCHAR(20)	-- 部门名称

)
INSERT INTO employee VALUES(1,'张三','软件开发部')
INSERT INTO employee VALUES(2,'李四','软件开发部')
INSERT INTO employee VALUES(3,'王五','应用维护部')

当海量数据时,deptName字段高冗余,为了解决这个问题 此时我们新建一张部门表

-- 解决数据冗余高的问题:
-- 独立设计一张部门的表
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,'秘书部');

对应的先drop 掉之前的员工表 ,更改表字段 然后重新插入数据
-- 修改员工表 
CREATE TABLE employee(
	id INT(4) PRIMARY KEY,
	empName VARCHAR(20),
	deptId INT	-- 部门ID	

)
INSERT INTO employee VALUES(1,'张三',1);
INSERT INTO employee VALUES(2,'李四',1);
INSERT INTO employee VALUES(3,'王五',2);

此时,某用户填写了4部门,若未加约束 则也入库,但部门表中根本不存在此部门

所以,添加外键约束,对员工表中的部门ID字段进行约束,
drop之前的员工表,新建:

CREATE TABLE employee(
	id INT PRIMARY KEY,
	empName VARCHAR(20),
	deptId INT,	-- 把部门名称改为部门ID
	-- 声明一个外键约束
	CONSTRAINT employee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id)
	  -- 外键名称(本表_参考表_fk)           外键字段	   参考表(字段)                  
)

此时,再插入4部门时:
INSERT INTO employee VALUES(4,'陈六','软件开发部')
-- 违反外键约束
Cannot ADD OR UPDATE a child ROW: a FOREIGN KEY CONSTRAINT fails (`day16`.`employee`, CONSTRAINT `employee_dept_fk` FOREIGN KEY (`deptId`) REFERENCES `dept` (`id`))






 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值