数据库的约束

 概念:限制用户操作数据库的一种行为(非法行为)
-- 直接插入null值或者某个非业务字段id一直在重复
-- 创建一张表stu表

CREATE TABLE stu(
	
	id INT,
	NAME VARCHAR(20),
	gender VARCHAR(3) DEFAULT '男'    -- 加入默认约束
);

插入数据:

INSERT INTO stu VALUES(1,'高圆圆','女'),(2,'文章','男') ;
INSERT INTO stu(id,NAME) VALUES(3,'王宝强') ;

上面gender字段没有插入数据,默认就是null,空值(没有意义)

1)默认约束 default :如果某个字段没有插入数据,那么默认约束起作用了

通过sql语句将默认约束去掉


ALTER TABLE stu MODIFY gender VARCHAR(3) ;
INSERT INTO stu(id,NAME) VALUES(4,'赵又廷') ;

通过sql语句给gender字段加上默认约束


ALTER TABLE stu MODIFY gender VARCHAR(3) DEFAULT '男' ;
DELETE FROM stu WHERE id = 4;

2)非空约束 not null,当前这个字段值不能为null

CREATE TABLE stu(
   id INT, -- 编号
   NAME VARCHAR(20), -- 姓名
   age INT, -- 年龄
   address  VARCHAR(50) NOT NULL-- 地址 ,加入非空约束
) ;

插入数据:


INSERT INTO stu VALUES(1,'高圆圆',42,'西安市'),(2,'赵又廷',45,'北京市') ;

地址插入一个null值

INSERT INTO stu VALUES(3,'张佳宁',32,NULL) ;  -- 这种直接插入null也属于非法行为

当address字段设置not null约束,直接限定用户不能插入null值


通过sql语句将非空约束去掉--修改表的类型


ALTER TABLE stu MODIFY address VARCHAR(50) ;
DELETE FROM stu WHERE id = 3;

通过sql语句将非空约束加上


ALTER TABLE stu MODIFY address VARCHAR(50) NOT NULL  ;

3)唯一约束unique (属于一种index :索引)

建表插值:

CREATE TABLE stu(
	id INT , -- 编号
	NAME VARCHAR(20), -- 姓名
	phone_number VARCHAR(11) UNIQUE -- 电话号码 必须设置唯一的
) ;
INSERT INTO stu VALUES(1,'高圆圆','13388886666'),(2,'张三','13255559999') ;
INSERT INTO stu VALUES(3,'张佳宁','13388886666') ;-- 重复值 Duplicate entry '13388886666' for key 'phone_number'

删除唯一约束的语法:atler table 表名 drop index  索引的字段名称(就当前类的字段名称一致的) ;

ALTER TABLE stu DROP INDEX phone_number ;

通过sql语句添加唯一约束,此时语法就和修改表的字段类型的语法一致了

ALTER TABLE stu MODIFY phone_number VARCHAR(11) UNIQUE ;

4)主键约束 primary key(非空且唯一的) 一般和auto_increment(自增长约束)使用多一些 设置在id非业务字段上

建表插值:

CREATE TABLE stu(
      id INT PRIMARY KEY AUTO_INCREMENT , -- 编号   加入主键约束,加入自增长
      NAME VARCHAR(20) -- 姓名
);

DROP TABLE stu ;
INSERT INTO stu VALUES(1,'高圆圆'),(2,'文章') ;
INSERT INTO stu VALUES(1,'赵又廷') ;-- Duplicate entry '1' for key 'PRIMARY' id是一个主键,值不能重复
INSERT INTO stu VALUES(NULL,'王宝强') ;-- Column 'id' cannot be null

通过sql将主键约束删除:

alter table 表名 drop PRIMARY  KEY ;

ALTER TABLE stu DROP PRIMARY  KEY;

通过sql语句将主键约束加入(唯一起作用)


ALTER TABLE stu MODIFY id INT PRIMARY KEY  ;

加入自增长约束之后,不需要给id赋值了,自己自增

自增长约束可以自己插入新的id,然后在之前id上继续自增

mysql有一个函数:获取最后一次自增长主键的id值

5)外键约束 foreign key

描述员工信息,创建一个表,员工编号,员工姓名,员工性别,员工所在部门

CREATE TABLE emp(

	id INT PRIMARY KEY AUTO_INCREMENT, -- 员工编号
	emp_name VARCHAR(10) , -- 员工姓名
	emp_gender VARCHAR(5), -- 员工性别
	emp_dept_name VARCHAR(10) -- 员工所在的部门名称
 
) ;

插入员工表数据

INSERT INTO emp(emp_name,emp_gender,emp_dept_name)
VALUES('文章','男','开发部'),
('高圆圆','女','测试部'),
('王宝强','男','运维部'),
('姚笛','女','测试部'),
('赵又廷','男','开发部') ,
('马保国','男','运维部') ;
DROP TABLE emp;

上面存在的问题:员工表中包含员工信息以及部门信息,这种情况不能在数据库中出现
查询出来的数据部门信息存在冗余,重复性大,优化改进:一张表始终描述一件事情
将员工表拆分出来:将部门信息放在部门表中

创建一张部门表 dept表

CREATE TABLE dept(
	id INT PRIMARY KEY AUTO_INCREMENT, -- 主键自增长约束 部门编号
	dept_name VARCHAR(20)   -- 部门名称
) ;

插入三个部门


INSERT INTO dept(dept_name) VALUES('开发部'),('测试部'),('运维部') ;

创建员工表

CREATE TABLE emp(

	id INT PRIMARY KEY AUTO_INCREMENT, -- 员工编号
	emp_name VARCHAR(10) , -- 员工姓名
	emp_gender VARCHAR(5), -- 员工性别
	dept_id INT -- 员工的部门id
 
) ;
INSERT INTO emp(emp_name,emp_gender,dept_id)
VALUES('文章','男',1),
('高圆圆','女',2),
('王宝强','男',3),
('姚笛','女',2),
('赵又廷','男',1) ,
('马保国','男',3) ;

插入了一条员工数据


INSERT INTO emp(emp_name,emp_gender,dept_id) VALUES('张三丰','男',4) ;

问题2:员工表中插入一条不存在的部门,两种表没有建立关系
解决:外键约束 foreign key ,员工表dept_id 和部门表主键id进行关联
外键所在的表----从表   (员工表)
部门表: 主表 

CREATE TABLE emp(

	id INT PRIMARY KEY AUTO_INCREMENT, -- 员工编号
	emp_name VARCHAR(10) , -- 员工姓名
	emp_gender VARCHAR(5), -- 员工性别
	dept_id INT,  -- 员工的部门id
	CONSTRAINT  -- 声明 
	 dept_emp_fk -- 外键名称  命名规则:主表名称_从表名称_fk
	 FOREIGN KEY (dept_id)   -- 作用在这个dept_id字段上 
	 REFERENCES dept(id)  -- 关联主表的主键id
 
) ;

删除3号部门
加入外键约束:修改和删除是很麻烦,需要先修改或者删除从表数据,然后修改/删除主表数据
将id为3的和id为的3清除

DELETE FROM emp WHERE id= 3 OR id = 6 ;
DELETE FROM dept WHERE id = 3;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DIO______________

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值