【超详细】Mysql数据库中的约束

目录

一、约束的概念和分类

1.约束的概念

2.约束的分类

二、案例分析 

1. 非空约束(not null)

2.  主键约束(primary key)

3.  默认约束 (defaut)

4.  自动增长 (auto_increment)

5.外键约束


一、约束的概念和分类

1.约束的概念

  • 约束是作用于表中列上的规则,用于限制加入表的数据
  • 约束的存在保证了数据库中数据的正确性、有效性和完整性

2.约束的分类

二、案例分析 

DROP TABLE IF EXISTS emp;

-- 员工表
CREATE TABLE emp (
  id INT PRIMARY KEY auto_increment, -- 员工id,主键且自增长 -- 【auto_increment】
  ename VARCHAR(50) NOT NULL UNIQUE, -- 员工姓名,非空并且唯一
  joindate DATE NOT NULL , -- 入职日期,非空
  salary DOUBLE(7,2) NOT NULL , -- 工资,非空
  bonus DOUBLE(7,2) DEFAULT 0 -- 奖金,如果没有奖金默认为0
);

1. 非空约束(not null)

-- 演示非空约束
insert into emp(id,ename,joindate,salary,bonus) values(3,null,'1999-11-11',8800,5000)-- 报错 null
insert into emp(id,ename,joindate,salary,bonus) values(3,"李四",'1999-11-11',8800,5000)-- 报错 唯一

(1)添加约束:

-- 创建表时添加非空约束

create table 表名(

        列名  数据类型 not null,

....

) ;

-- 建完表后添加约束

alter table 表名 modify 字段名 数据类型 not null;

(2) 删除约束:

alter table 表名 modify 字段名 数据类型;

2.  主键约束(primary key)

-- 演示主键约束:非空且唯一
insert into emp(id,ename,joindate,salary,bonus) values(1,"张三",'1999-11-11',8800,5000);

insert into emp(id,ename,joindate,salary,bonus) values(1,"张三",'1999-11-11',8800,5000);-- 报错,id唯一
insert into emp(id,ename,joindate,salary,bonus) values(null,"张三",'1999-11-11',8800,5000);-- 报错 null

insert into emp(id,ename,joindate,salary,bonus) values(2,"李四",'1999-11-11',8800,5000);

(1)添加约束:

-- 创建表时添加主键约束

create table 表名(

        列名  数据类型 primary key [auto_increment],

....

) ;

create table 表名(

        列名  数据类型 ,

        [constraint] [约束名称] primary key (列名)

....

) ;

-- 建完表后添加主键约束

alter table 表名 add primary key(字段名);

(2) 删除约束:

alter table 表名 drop  primary key;

3.  默认约束 (defaut)

-- 演示默认约束
insert into emp(id,ename,joindate,salary) values(3,"王五",'1999-11-11',8800);-- defaut 约束 不给任何值

insert into emp(id,ename,joindate,salary,bonus) values(4,"赵六",'1999-11-11',8800,null);-- null也算值

(1)添加约束:

-- 创建表时添加默认约束

create table 表名(

        列名  数据类型 default 默认值,

....

) ;

-- 建完表后添加默认约束

alter table 表名 alter 列名 set defaut 默认值;

(2) 删除约束:

alter table 表名 arter 列名 drop default;

4.  自动增长 (auto_increment)

当列是数字类型且唯一时可用"auto_increment"

-- 演示自动增长:auto_increment:当列是数字类型且为唯一约束时
insert into emp(ename,joindate,salary,bonus) values("赵六",'1999-11-11',8800,null);-- null也算值
insert into emp(id,ename,joindate,salary,bonus) values(null,"赵六2",'1999-11-11',8800,null);
insert into emp(id,ename,joindate,salary,bonus) values(null,"赵六3",'1999-11-11',8800,null);

5.外键约束

  • 概念:外键用来让两个表的数据之间建立连接,保证数据的一致性和完整性

/*
	外键约束:
		* 外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性

	
	-- 创建表时添加外键约束
	CREATE TABLE 表名(
		 列名 数据类型,
		 …
		 [CONSTRAINT] [外键名称] FOREIGN KEY(外键列名) REFERENCES 主表(主表列名) 
	); 


	-- 建完表后添加外键约束
	ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);


	-- 删除约束
	ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
	
	
*/
-- 删除表
DROP TABLE IF EXISTS emp;
DROP TABLE IF EXISTS dept;


-- 部门表
CREATE TABLE dept(
	id int primary key auto_increment,
	dep_name varchar(20),
	addr varchar(20)
);
-- 员工表 
CREATE TABLE emp(
	id int primary key auto_increment,
	name varchar(20),
	age int,
	dep_id int,

	-- 添加外键 dep_id,关联 dept 表的id主键
	CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES dept(id)
		
);
-- 添加 2 个部门
insert into dept(dep_name,addr) values
('研发部','广州'),('销售部', '深圳');

-- 添加员工,dep_id 表示员工所在的部门
INSERT INTO emp (NAME, age, dep_id) VALUES 
('张三', 20, 1),
('李四', 20, 1),
('王五', 20, 1),
('赵六', 20, 2),
('孙七', 22, 2),
('周八', 18, 2);

-- ------------------
select * from emp;
select * from dept;


-- 删除外键
alter table emp drop FOREIGN key fk_emp_dept;


-- 建完表后,添加外键
alter table emp add CONSTRAINT fk_emp_dept FOREIGN key(dep_id) REFERENCES dept(id);

5.1建员工表和部门表

-- 删除表
DROP TABLE IF EXISTS emp;
DROP TABLE IF EXISTS dept;


-- 部门表
CREATE TABLE dept(
	id int primary key auto_increment,
	dep_name varchar(20),
	addr varchar(20)
);
-- 员工表 
CREATE TABLE emp(
	id int primary key auto_increment,
	name varchar(20),
	age int,
	dep_id int,

	-- 添加外键 dep_id,关联 dept 表的id主键
	CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES dept(id)
		
);

 5.2 语法

(1)添加约束:

-- 创建表时添加外键约束

create table 表名(

        列名  数据类型 ,

        ....

[constraint] [外键名称] foreign key(外键列名) references 主表(主表列名)

-- 添加外键 dep_id,关联 dept 表的id主键,外键名称随便写,一般以fk_开头
	CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES dept(id)

) ;

-- 建完表后添加外键约束

alter table 表名 add constraint 外键名称 foreign key(外键字段名称)references 主表名称(主列表名称);

​-- 建完表后,添加外键
alter table emp add CONSTRAINT fk_emp_dept FOREIGN key(dep_id) REFERENCES dept(id);

(2) 删除约束:

alter table 表名  drop foreign key 外键名称;

-- 删除外键
alter table emp drop FOREIGN key fk_emp_dept;

注意:

  • 先创建主表和添加主表里的数据,在对从表进行操作!!!
  • 删除时,先删去从表数据才能删对应的主表数据!!!

猜你喜欢

转载自blog.csdn.net/weixin_48373085/article/details/128528737