数据库的约束


文章目录

  • 数据库的约束
  • 主键约束(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)

设置外键约束的原因:

为了保证数据的有效性和完整性,我们需要在多表的一方添加外键约束,特点如下:

  1. 在多(主)表的一方不能增加单(从)表没有的数据
  2. 在单(从)表的一方不能删除多(主)表一方存在的数据

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
);