LOVEJOAN

文章 分类 评论
76 9 1453

站点介绍

人生是一场孤独的旅行,没有终点。。。

数据库约束

chuck 2023-05-08 337 17条评论 数据库 mysql

首页 / 正文

约束

用于限制数据库结构中存储的数据。目的是为了保证数据库中数据的正确、有效性和完整性。

常见约束:

约束作用关键字
非空约束限制字段数据不能为NULLNOT NULL
唯一约束限制字段的数据唯一,不能重复UNIQUE
主键约束设置字段为主键,主键满足非空和唯一约束PRIMARY KEY
默认约束字段默认值DEFAULT
检查约束保证字段值满足条件(8.0.16版本后),CHECK
外键约束与其他表建立连接的关系FOREIGN KEY

非空约束

# 关键字 NOT NULL
# 可以在创建时在字段后加上NOT NULL,也可以通过ALTER TABLE 修改时增加非空约束
# 创建时添加
CREATE TABLE IF NOT EXISTS emp(
id int NOT NULL AUTO_INCREMENT comment "编号",
uid varchar(20) comment "工号",
name varchar(20) comment "姓名",
age int comment "年龄")
# 修改
ALTER TABLE emp MODIFY name varchar(20) NOT NULL;
# 取消非空约束,再修改为NULL即可
ALTER TABLE emp MODIFY name varchar(20) NULL;

唯一约束

# 设置字段值唯一,不能出现重复
# 创建字段时添加
CREATE TABLE IF NOT EXISTS emp(
id int NOT NULL AUTO_INCREMENT comment "编号",
uid varchar(20) comment "工号",
name varchar(20) UNIQUE comment "姓名",
age int comment "年龄");

# 通过ALTER TABLE添加约束
ALTER TABLE emp MODIFY name varchar(20) UNIQUE;

# 删除唯一约束
ALTER TABLE emp DROP INDEX name;

主键约束

# 主键约束,主键是一行记录的唯一标识,满足非空和唯一性约束
# 创建表时指定主键字段,指定编号字段为主键
CREATE TABLE IF NOT EXISTS asset(
id int PRIMARY KEY AUTO_INCREMENT comment "编号"
);

# 修改表的主键字段
ALTER TABLE employee ADD PRIMARY KEY(id);

# 删除主键设置
# 1.使用ALTER TABLE语句
ALTER TABLE 表名 DROP PRIMARY KEY;
# 2.使用DROP INDEX语句
DROP INDEX 主键名 ON 表名;

# 通过PRIMARY KEY 在字段名后指定一个字段为主键或者通过单独一行PRIMARY KEY(id,name)设置多个字段为联合主键
CREATE TABLE `tableName` (
`col1` INT NOT NULL,
`col2` INT NOT NULL,
`col3` VARCHAR(20),
PRIMARY KEY(`col1`,`col2`)
);

默认约束

# 通过默认约束DEFAULT设置字段默认值
# 添加
CREATE TABLE IF NOT EXISTS emp(
id int NOT NULL AUTO_INCREMENT comment "编号",
uid varchar(20) comment "工号",
name varchar(20) comment "姓名",
age int comment "年龄",
gender varcher(1) DEFAULT '男'
);
# 修改表时添加约束
ALTER TABLE emp MODIFY gender varchar(1) DEFAULT('男');
# 删除,直接取消DEFAULT即可
ALTER TABLE emp MODIFY gender varchar(1);

检查约束

# CHECK可以检查数据记录满足一定条件才能录入,不过好像测试后不生效,网上说这不是真正支持的特性,需要通过触发器等其他方式实现
ALTER TABLE emp MODIFY age int CHECK (age > 0 and age < 120) comment '年龄';

外键约束

# 外键FOREIGN KEY设置与其他表查询时的数据一致性问题
# 一个表(父表)的主键是另外一个表的外键(子表)
# 添加外键
CREATE TABLE 表名(
    字段名 数据类型
    [CONSTRAINT] [外键名称] FROEIGN KEY (外键字段名) REFERENCES 主表(主表列名)
)
# 示例
CREATE TABLE IF NOT EXISTS use_assets(
id int PRIMARY KEY AUTO_INCREMENT comment 'id',
user_id int comment '用户ID',
asset_id int comment '资产ID',
address varchar(20) comment '存放部门',
FOREIGN KEY(user_id) REFERENCES emp(id),
FOREIGN KEY(asset_id) REFERENCES asset(id)
);
# 修改表时添加外键
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表(主表字段名);

# 删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

# 定义更新外键数据的操作
# NO ACTION,更新父表数据,如果有外键数据则不允许删除或更新
# RESTRICT,更新父表数据,如果有外键数据则不允许删除或更新
# CASCADE,更新父表数据,如果有外键数据则同步删除或更新子表数据
# SET NULL,更新父表数据,如果有外键数据则设置为NUL(需要子表允许为NULL)
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表(主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;

# 使用外键可以在物理层验证数据完整性和一致性,但是每次更新数据都需要查询关联表是否有数据,可能会降低性能

评论(17)

  1. 1 游客 2025-03-27 23:54 回复

    555

  2. 1 游客 2025-03-27 23:53 回复

    555V4IONT6U')) OR 376=(SELECT 376 FROM PG_SLEEP(15))--

  3. 1 游客 2025-03-27 23:52 回复

    555-1 OR 330=(SELECT 330 FROM PG_SLEEP(15))--

  4. 1 游客 2025-03-27 23:51 回复

    5550"XOR(555*if(now()=sysdate(),sleep(15),0))XOR"Z

  5. 1 游客 2025-03-27 23:50 回复

    555

  6. 1 游客 2025-03-27 23:49 回复

    555

  7. @@cOOC0 游客 2025-03-27 23:46 回复

    555

  8. 1HilZY1bL'; waitfor delay '0:0:15' -- 游客 2025-03-27 23:44 回复

    555

  9. -1' OR 2+163-163-1=0+0+0+1 -- 游客 2025-03-27 23:43 回复

    555

  10. -1 OR 3+963-963-1=0+0+0+1 游客 2025-03-27 23:43 回复

    555

  11. -1 OR 2+963-963-1=0+0+0+1 游客 2025-03-27 23:43 回复

    555

  12. -1 OR 3+543-543-1=0+0+0+1 -- 游客 2025-03-27 23:43 回复

    555

  13. -1 OR 2+543-543-1=0+0+0+1 -- 游客 2025-03-27 23:43 回复

    555

  14. 1 游客 2025-03-27 23:43 回复

    555

  15. 1 游客 2025-03-27 23:42 回复

    555

  16. 1 游客 2025-03-27 23:41 回复

    555

  17. 1 游客 2025-03-27 23:40 回复

    555

热门文章

最新评论

  • 1

    555fulIdEqZ' OR 160=(SELECT 160 FROM PG_SLEEP(15))--

  • 1

    555-1)) OR 58=(SELECT 58 FROM PG_SLEEP(15))--

  • 1

    555-1) OR 13=(SELECT 13 FROM PG_SLEEP(15))--

  • 1

    555-1 OR 475=(SELECT 475 FROM PG_SLEEP(15))--

  • 1

    555

  • 1

    555

  • 1

    5554FobGRsu') OR 696=(SELECT 696 FROM PG_SLEEP(15))--

  • 1

    555C9F0upP1' OR 504=(SELECT 504 FROM PG_SLEEP(15))--

  • 1

    555

  • 1-1; waitfor delay '0:0:15' --

    555

日历

2025年05月

    123
45678910
11121314151617
18192021222324
25262728293031

文章目录