一、什么是约束?
1、概念: 约束是作用在表中字段上的规则,用于限制存储在表中的数据
2、目的:保证数据库中数据的正确性、有效性和完整性。
3、分类: 约束作用于表中字段上,可以在创建表/修改表的时候添加约束
二、编写约束条件
根据以下约束,完成表结构的创建
字段名 | 字段含义 | 字段类型 | 约束条件 |
id | id唯一标识 | int | 主键,并且自动增长 |
name | 姓名 | varcha(10) | 不为空,并且唯一 |
age | 年龄 | int | 大于0,并且小于等于120 |
status | 状态 | char(1) | 如果没有指定改值,默认为1 |
gender | 性别 | char(1) | 无 |
select table user(
id int primary key auto_increment ,
name varchar(10) not null unique,
age int check(age > 0 and age <= 120) ,
status char(1) default'1' , # 因为status是字符串 所以1 这边要加上引号
gender char(1)
);
insert into user(name,age,status,gender)
values('tom',19,'1','男'),('tmo2',25,'0','男');
三、外键约束
1、什么是外键约束? 外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。
create table dept(
id int auto_increment comment 'ID' primary key ,
name varchar(50) not null comment '部门名称'
)comment '部门表';
insert into dept (id, name) values(1,'研发部'),(2,'市场部'),(3,'财务部'),(4,'销售部'),(5,'总经办');
create table emp(
id int auto_increment comment 'id' primary key ,
name varchar(50) not null comment '姓名',
age int comment '年龄',
job varchar(20) comment '职位',
salary int comment '薪资',
enterdate date comment '入职时间',
managerid int comment '直属领导id',
dept_id int comment '部门id'
)comment '员工表';
insert into emp(id, name, age, job, salary, enterdate, managerid, dept_id)
VALUES (1,'金庸',66,'总裁',20000,'2000-01-01',null,5),
(2,'张无忌',20,'项目经理',12500,'2005-12-05',2,1),
(3,'杨逍',33,'开发',8400,'2000-11-03',2,1),
(4,'韦一笑',48,'开发',11000,'2002-02-05',2,1),
(5,'常遇春',43,'开发',10500,'2004-09-07',3,1),
(6,'小昭',19,'程序员鼓励师',6600,'2004-10-12',2,1);
# 添加外键
#1、 创建表的时候直接设置 [CONSTRAINT] [外键名称] FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名)
CONSTRAINT fk_emp_dept_id FOREIGN KEY (dept_id) REFERENCES dept(id);
#2、创建完表后 去修改表字段 ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表(主表列名);
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);
#3、删除外键 ALTER TABLE 表名 DROP FOREIGN KEY 外键名;
alter table emp drop FOREIGN KEY fk_emp_dept_id ;
2、外键的删除、更新
# ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES 主表名(主表字段名) ON UPDATE 行为 ON DELETE 行为;
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update cascade on delete cascade; # 对父表操作后 子表也会变化 假如我们将父表中的id改为6 那么 dept_id 也改为6 ;假如我们将父表中的id为6的删除 那么 dept_id 中原来为6 也会删除
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update set null on delete set null ; # 对父表操作后 子表也会变化 假如我们将父表中的id为6的删除 那么 dept_id 中原来为6 的变成<null>