数据库约束的概述
约束的作用:
对表中的数据进行限制,保证数据的正确性、有效性和完整性。一个表如果添加了约束,不正确的数据将无法插入到表中。约束在创建表的时候添加比较合适。
约束种类
| 约束名 | 约束关键字 |
|---|---|
| 主键 | primary key |
| 唯一 | unique |
| 非空 | not null |
| 外键 | foreign key |
| 检查约束 | check 注:mysql不支持 |
主键约束
-
主键的作用
用来唯一标识数据库中的每一条记录 -
哪个字段应该作为表的主键?
通常不用业务字段作为主键,单独给每张表设计一个id的字段,把id作为主键。主键是给数据库和程序使用的,不是给最终的客户使用的。所以主键有没有含义没有关系,只要不重复,非空就行。
如:身份证,学号不建议做成主键 -
创建主键
主键关键字:primary key -
主键的特点:
- 非空 not null
- 唯一
-
创建主键方式:
- 在创建表的时候给字段添加主键
字段名 字段类型 PRIMARY KEY.-- 创建表学生表stu, 包含字段(id, name, age)将id做为主键 create table stu ( id int primary key, -- id为主键 name varchar(20), age int ) - 在已有表中添加主键
ALTER TABLE 表名 ADD PRIMARY KEY(字段名);-- 删除stu表的主键 alter table stu drop primary key; -- 添加主键 alter table stu add primary key(id);
-
主键自增
主键如果让我们自己添加很有可能重复,通常希望在每次插入新记录时,数据库自动生成主键字段的值
AUTO_INCREMENT 表示自动增长(字段类型必须是整数类型)- 修改自增长的默认值起始值
默认地AUTO_INCREMENT的开始值是1,如果希望修改起始值,请使用下列SQL语法--创建表时指定起始值 CREATE TABLE 表名( 列名 int primary key AUTO_INCREMENT ) AUTO_INCREMENT=起始值;-- 指定起始值为1000 create table st4 ( id int primary key auto_increment, name varchar(20) ) auto_increment = 1000;ALTER TABLE 表名 AUTO_INCREMENT=起始值;alter table st4 auto_increment = 2000;
- 修改自增长的默认值起始值
-
DELETE和TRUNCATE对自增长的影响
- DELETE:删除所有的记录之后,自增长
没有影响。 - TRUNCATE:删除以后,自增长又
重新开始。
- DELETE:删除所有的记录之后,自增长
唯一约束
什么是唯一约束: 表中某一列不能出现重复的值
唯一约束的基本格式
字段名 字段类型 UNIQUE
-- 创建学生表st7, 包含字段(id, name),name这一列设置唯一约束,不能出现同名的学生
create table st7 (
id int,
name varchar(20) unique
)
-- 添加一个同名的学生
insert into st7 values (1, '张三');
select * from st7;
--错误描述: Duplicate entry '张三' for key 'name'
insert into st7 values (2, '张三');
-- 重复插入多个null会怎样?
insert into st7 values (2, null);
insert into st7 values (3, null);
null没有数据,不存在重复的问题
非空约束
- 什么是非空约束:
某一列不能为null。 - 非空约束的基本语法格式:
字段名 字段类型 NOT NULL
-- 创建表学生表st8, 包含字段(id,name,gender)其中name不能为NULL
create table st8 (
id int,
name varchar(20) not null,
gender char(1)
)
-- 添加一条记录其中姓名不赋值
insert into st8 values (1,'张三疯','男');
select * from st8;
-- error描述:Column 'name' cannot be null
insert into st8 values (2,null,'男');
- 默认值
什么是默认值:
字段名 字段类型 DEFAULT 默认值
-- 创建一个学生表 st9,包含字段(id,name,address), 地址默认值是广州
create table st9 (
id int,
name varchar(20),
address varchar(20) default '广州'
)
-- 添加一条记录,使用默认地址
insert into st9 values (1, '李四', default);
select * from st9;
insert into st9 (id,name) values (2, '李白');
-- 添加一条记录,不使用默认地址
insert into st9 values (3, '李四光', '深圳');
疑问:如果一个字段设置了非空与唯一约束(主键特点),该字段与主键的区别?
- 主键数在一个表中,只能有一个。不能出现多个主键。
主键可以单列,也可以是多列。 - 自增长
只能用在主键上。
外键约束
foreign key:让表于表产生关系,从而保证数据的正确性。
单表问题:
- 数据冗余
- 后期还会出现增删改的问题
-
什么是外键约束
什么是外键:在从表中与主表主键对应的那一列,如:员工表中的dep_id
主表: 一方,用来约束别人的表
从表: 多方,被别人约束的表 -
创建约束的语法
- 新建表时增加外键:
[CONSTRAINT] [外键约束名称] FOREIGN KEY(外键字段名) REFERENCES 主表名(主键字段名)- 已有表增加外键:
ALTER TABLE 从表 ADD [CONSTRAINT] [外键约束名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主键字段名); -
删除外键
ALTER TABLE 从表 drop foreign key 外键名称;-- 删除employee表的emp_depid_fk外键 alter table employee drop foreign key emp_depid_fk; -- 在employee表情存在的情况下添加外键 alter table employee add constraint emp_depid_fk foreign key (dep_id) references department(id); -
外键的级联
- 什么是级联操作:
在修改和删除主表的主键时,同时更新或删除副表的外键值,称为级联操作级联
- 什么是级联操作:
| 级联操作语法 | 描述 |
|---|---|
| ON UPDATE CASCADE | 级联更新,只能是创建表的时候创建级联关系。更新主表中的主键,从表中的外键列也自动同步更新 |
| ON DELETE CASCADE | 级联删除 |
-- 创建employee表,添加级联更新和级联删除
drop table employee;
create table employee(
id int primary key auto_increment,
name varchar(20),
age int,
dep_id int, -- 外键对应主表的主键
-- 创建外键约束
添加表的级联操作 on update cascade on delete cascade(可以同时添加)
constraint emp_depid_fk foreign key (dep_id) references
department(id) on update cascade on delete cascade
)
数据库约束精讲
本文深入讲解数据库中的各种约束,包括主键、唯一、非空、外键及检查约束,探讨它们如何确保数据的正确性、有效性和完整性。通过实例演示主键的创建、自增特性,以及唯一、非空约束的应用,同时解析外键如何建立表间关系。
1095

被折叠的 条评论
为什么被折叠?



