目录
约束
约束的概念和分类
1、约束的概念:
- 约束时作用于表中列上的规则,用于限制加入表的数据
- 约束的存在保证了数据库中数据的正确性、有效性和完整性
2、约束的分类
练习:
CREATE TABLE emp(
id INT PRIMARY KEY,
ename VARCHAR(50) NOT NULL UNIQUE,
joindate DATE NOT NULL,
salary DOUBLE(7,2) NOT NULL,
bonus DOUBLE(7,2) DEFAULT 0
);
insert into emp(id,ename,joindate,salary,bonus) VALUES(1,'张三','1999-11-11',8800,5000);
1、测试主键约束 非空且唯一(将id的1改为了null)
又运行了一遍已有的,显示[Err] 1062 - Duplicate entry '1' for key 'PRIMARY'
2、测试非空约束 不能为null
测试主键的时候已经测试了不能为空,这里就不演示啦
3、测试唯一约束 表中所有数据各不相同
这里也是,主键的时候测试了以下,也就不演示啦
4、测试默认约束 未指定值则采用默认值
这里我把bonus和5000 去掉了,我们看看结果是什么
取值为默认值0
只有不添加任何值的时候默认约束才能生效,输入null的话,显示的就是null。我们来看一下
显示的就是null,而不是0;
5、测试自动增长:auto_increment当列是数字类型并且唯一约束
这里我们得重新建表
drop table if EXISTS emp;
CREATE TABLE emp(
id INT PRIMARY KEY auto_increment,
ename VARCHAR(50) NOT NULL UNIQUE,
joindate DATE NOT NULL,
salary DOUBLE(7,2) NOT NULL,
bonus DOUBLE(7,2) DEFAULT 0
);
没加数据的就把前面的id删了
我们看一下结果如何
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~·
在建完表后如果要添加约束的话,我们该如何取写代码
1、主键约束
alter table 表名 add primary key(字段名);
删除约束:
alter table 表名 drop index 字段名;
2、默认约束
alter table 表名 alter 列名 set default 默认值;
删除约束
alter table 表名 alter 列名 drop default;
3、非空约束
alter table 表名 modify 字段名 数据类型 not null;
删除约束:
alter table 表名 modify 字段名 数据类型;
4、唯一约束
alter table 表名 modify 字段名 数据类型 unique;
删除约束
alter table 表名 drop index 字段名;
5、外键约束
外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性
添加约束
创建时添加外键约束
create table 表名(
列名 数据类型,
.....
[constraint][外键名称] foreign key (外键字段名) references 主表名称(主表列名称)
);
建完表后添加外键约束
alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表名称(主表列名称)
删除约束:
alter table 表名 drop foreign key 外键名称;
添加外键dep_id,关联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,
CONSTRAINT fk_emp_dept FOREIGN key(dep_id) REFERENCES dept(id)
);
insert into dept(dep_name,addr) VALUES('研发部','广州'),('销售部','深圳');
insert into emp(name,age,dep_id) VALUES('张三',20,1),('李四',20,1),('王五',20,1),('赵六',20,2),('孙七',22,2),('周八',18,2);
这样就不能删除dept表中的数据了
会显示有外键的约束
但如果我想要删除研发部,那就得先删除张三李四王五三条数据
这样就可以删除研发部了
在对象中按住ctrl选中这两张表
再点击逆向表到模型
就能看到这俩张是有个外键约束着的
删除外键:
alter table emp drop FOREIGN key fk_emp_dept;
这样两张表中的线就没了
创建过表之后添加外键:
alter table emp add CONSTRAINT fk_emp_dept FOREIGN key(dep_id) REFERENCES dept(id);
未完待续。。。