数据库的约束
文章目录
- 数据库的约束
- 主键约束(primary key)
- 1.添加主键约束的方法:
- 2.设置联合主键
- 唯一约束(unique):
- 非空约束(not null):
- 自增长约束 (auto_increment):
- 非负约束 (UNSIGNED):
- 枚举约束
- 删除主键约束
- 外键约束(foreign key)
- 级联删除(ON DELETE CASCADE):
- 级联更新(ON UPDATE CASCADE):
概念:对插入表中的数据做出的一定的限定
主键约束(primary key)
特点:非空且唯一,一张表只能存在一个主键
1.添加主键约束的方法:
- 方法一:建表的时候添加主键
create table 表名 (列1 数据属性 primary key,…)
- 方法二:通过修改表添加主键
alter table 表名 add primary key (列名)
- 方式三:添加额外的语句设置主键
create table 表名 (列1 数据属性 …)
primary key(列1)
2.设置联合主键
将多个字段看做一个整体设置为主键
设置联合主键的方法:
- 方法一:在创建表的额外语句上设置主键
create table 表名 (列1 数据属性 …)
primary key(列1,列2)
- 方法二:通过修改表的方式设置联合主键
alter table 表名 add primary key (列1,列2)
唯一约束(unique):
特点:数据唯一,对于null值不起作用
语法结构:
create table 表名 (列1 数据属性 unique …)
非空约束(not null):
特点:表中的数据不为null值
语法结构:
create table 表名 (列1 数据属性 not null …)
非空约束和唯一约束的结合与主键的区别:
可以给多个列设置非空且唯一
CREATE TABLE 表名(
列2 数据属性 NOT NULL UNIQUE,
列1 数据属性NOT NULL UNIQUE)
自增长约束 (auto_increment):
特点:配合主键约束来使用,并且主键字段的类型 是个整数型字段
CREATE TABLE 表名(
列1 数据属性PRIMARY KEY AUTO_INCREMENT)
列1的数据会从1不断累计,但是如果移除掉最后的一行数据,数据会从删除的
地方往后执行,不会再继续
非负约束 (UNSIGNED):
– TINYINT -128–127
CREATE TABLE test11(
id TINYINT,
)
INSERT INTO test11 VALUES(127);CREATE TABLE test12(
id TINYINT UNSIGNED, – 非负约束
)INSERT INTO test12 VALUES(255);
枚举约束
CREATE TABLE test13(
列1 ENUM(‘选项1’,‘选项2’,‘选项3’) – enum 枚举类型
)
删除主键约束
删除主键约束:分两种情况
- 情况1: 这个字段,只有主键约束,分两步来删除主键约束
- 第一步: alter table 表名 drop primary key; – 这样只删除了唯一,他还有个非空约束,所以得再删除非空约束
- 第二步: alter table [表名] modify [列名] varchar(20) null; --修改字段名还为原来的字段 加上null即可
- 情况2: 这个字段,是一个int类型字段,既有主键约束,又有自增长约束,那么得先删除自增长约束,在删除主键约束
- 第一步:删除自增长约束,其实就是修改自增长字段名和数据类型还为原来的字段名和类型
alter table 表名 change 字段名 字段名 数据类型; --删除自增长约束 - 第二步:删除主键约束
alter table 表名 drop primary key; - 第三步:删除非空约束
ALTER TABLE test3 MODIFY sid INT NULL; – 就是修改字段值可以为null
外键约束(foreign key)
设置外键约束的原因:
为了保证数据的有效性和完整性,我们需要在多表的一方添加外键约束,特点如下:
- 在多(主)表的一方不能增加单(从)表没有的数据
- 在单(从)表的一方不能删除多(主)表一方存在的数据
CREATE TABLE USER(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20)
);CREATE TABLE orders(
id INT PRIMARY KEY AUTO_INCREMENT,
totalprice DOUBLE,
user_id INT
);ALTER TABLE orders ADD FOREIGN KEY(user_id) REFERENCES USER(id);
在外键的约束的情况下,先删除用户的所有订单,然后删除用户
级联删除(ON DELETE CASCADE):
一般在上线的时候添加,在测试时一般不会添加级联删除。
ALTER TABLE orders ADD FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE;
级联更新(ON UPDATE CASCADE):
当在多表中修改数据可以在单表也是会修改的
CREATE TABLE zhu(
zid INT PRIMARY KEY AUTO_INCREMENT,
zname VARCHAR(20));
CREATE TABLE cong(
zid INT PRIMARY KEY AUTO_INCREMENT,
zscore INT,
zzid INT,
– 方式2:建表的时候就加上了级联更新和级联删除
FOREIGN KEY(zzid) REFERENCES zhu(zid) ON DELETE CASCADE ON UPDATE CASCADE
);