当前位置: 首页 > article >正文

SQL中的约束

约束(CONSTRAINT)

对表中字段的限制

  1. 非空约束NOT NULL
    只能声明在每个字段的后面

    CREATE TABLE test(
    id INT NOT NULL,
    last_name VARCHAR(15),
    phone VARCHAR(20) NOT NULL
    );
    
  2. 唯一性约束UNIQUE
    说明:
    ① 可以声明在字段的后面,也可以声明在表的后面
    ② 如果不指定约束名字,默认和字段名相同
    ③ 设置UNIQUE的字段,可以有多条记录是NULL
    ④ 表级约束,可以将多个字段组合成唯一性约束

    在创建表时,设置唯一性约束

    CREATE TABLE test(
    id INT UNIQUE, # 列级的唯一性约束
    last_name VARCHAR(15),
    email VARCHAR(25),
    salary DECIMAL(10,2),
    CONSTRAINT uk_test_email UNIQUE(email) # 表级的唯一性约束,指明约束名称
    # UNIQUE(email) #表级的唯一性约束,不指定约束名,简写形式
    # CONSTRAINT uk_test_id_email UNIQUE(id, email) # 表级唯一性约束
    );
    

    修改唯一性约束

    # 方式一
    ALTER TABLE test
    ADD CONSTRAINT uk_test_salary UNIQUE(salary);
    # ADD UNIQUE(salary) #不指定约束名,简写形式
    
    #方式二
    ALTER TABLE test
    MODIFY salary DECIMAL(10,2) UNIQUE;
    

    删除唯一性约束
    说明
    ① 添加唯一性约束的列上,也会自动创建唯一索引
    ② 删除唯一性约束只能通过删除唯一索引的方式
    ③ 删除时需要指定唯一索引名(与唯一性约束名相同)
    ④ 如果创建唯一约束时未指定约束名,如果是单列,默认和字段名一致,如果是多列,默认是()中第一个字段名相同

    ALTER TABLE test
    DROP INDEX 唯一索引名;
    

    查看表中的唯一索引

    SHOW INDEX FROM 表名;
    
  3. 主键约束PRIMARY KEY
    说明:
    ① 一个表中只能有一个主键约束,要么单列,要么复合列
    ② 主键约束的列不能为NULL,且不能重复
    ③ 主键名为PRIMARY,不可修改
    ④ 用于唯一标识表中的一条记录

    CREATE TABLE test(
    id INT PRIMARY KEY, # 列级约束
    last_name VARCHAR(15),
    salary DECIMAL(10,2)
    # CONSTRAINT PRIMARY KEY(id) #表级约束
    # PRIMARY KEY(id, last_name) #复合主键约束
    );
    
    # 删除主键约束
    ALTER TABLE test
    DROP PRIMARY KEY;
    
  4. 自增列AUTO_INCREMENT
    说明
    ① 某个字段值的自增
    ② 一个表中最多有一个自增长列
    ③ 自增长列必须是键列(PRIMARY KEYUNIQUE
    ④ 自增列必须是整数类型
    ⑤ 当向自增列添加0或NULL时,实际上会设置成自增值

    CREATE TABLE test(
    id INT PRIMARY KEY AUTO_INCREMENT,
    last_name VARCHAR(15),
    salary DECIMAL(10,2)
    );
    
    # 删除自增列
    ALTER TABLE test
    MODIFY id INT;
    
  5. 外键约束FOREIGN KEY
    说明
    ① 限定某个表的某个字段的引用完整性
    ② 从表的外键列,必须是主表的主键或唯一约束
    ③ 在创建外键约束时,如果不手动命名,则会自动产生一个外键名

    # 创建主表
    CREATE TABLE departments(
    id INT PRIMARY KEY AUTO_INCREMENT,
    `name` VARCHAR(15)
    );
    # 创建从表
    CREATE TABLE employees(
    id INT PRIMARY KEY AUTO_INCREMENT,
    last_name VARCHAR(15),
    department_id INT,
    CONSTRAINT fk_emp_dept_id FOREIGN KEY (department_id) REFERENCES departments(id)
    );
    

    约束等级
    CASCADE:在父表上update/delete记录时,同步update/delete子表上匹配的记录
    SET NULL:在父表上update/delete记录时,将子表上匹配的记录设置为NULL(子表外键不能为NOT NULL)
    NO ACTION:如果子表中引用了父表中的内容,则不允许删除父表中被引用的记录
    RESTRICT:同NO ACTION
    SET DEFAULT:父表有变更时,子表对应字段会设置成默认值

    # 当主表修改主键时,从表所有引用的部分也会响应修改
    # 当主表删除某条数据时,从表所有引用的部分会设置成NULL
    CREATE TABLE employees(
    id INT PRIMARY KEY AUTO_INCREMENT,
    last_name VARCHAR(15),
    department_id INT,
    FOREIGN KEY (department_id) REFERENCES departments(id) ON UPDATE CASCADE ON DELETE SET NULL
    );
    
    # 删除外键约束
    ALTER TABLE employees
    DROP FOREIGN KEY 外键约束名;
    
  6. 检查约束CHECK
    说明
    ① 检查某个字段的值是否符合某些要求,一般指值的范围

    CREATE TABLE employees(
    id INT PRIMARY KEY AUTO_INCREMENT,
    last_name VARCHAR(15),
    salary DECIMAL(10,2) CHECK(salary > 3000)
    );
    
  7. 默认值约束DEFAULT

    CREATE TABLE test(
    id INT PRIMARY KEY AUTO_INCREMENT,
    last_name VARCHAR(15),
    salary DECIMAL(10,2) DEFAULT 2000
    );
    

http://www.kler.cn/a/451228.html

相关文章:

  • 【C++】设计模式
  • 数字工厂管理系统就是ERP系统吗
  • 【Yonghong 企业日常问题 06】上传的文件不在白名单,修改allow.jar.digest属性添加允许上传的文件SH256值?
  • Issac ROS navigation测试
  • vue3 如何使用 mounted
  • 虚幻5 UE5 UNREALED_API d虚幻的
  • 数据库管理系统——NoSQL之文档数据库(MongoDB)
  • WEB UI 创建视图
  • 单片机:实现定时器中断(数码管读秒+LED闪烁)(附带源码)
  • 顶顶通呼叫中心中间件mod_cti模块安全增强,预防盗打风险(mod_cti基于FreeSWITCH)
  • CSS系列(26)-- 动画性能优化详解
  • SDK 指南
  • 【每日学点鸿蒙知识】启动耗时分析、IDE报错、emitter内存泄漏、radio C API、SDK下载失败
  • IDEA2024如何清理缓存和重启【最新教程】
  • vue+openlayers直接前端加载tif文件,不需要geoserver发布
  • Flutter 开关属性
  • React 前端框架简介
  • 医疗信息系统有哪些
  • Jenkins 持续集成部署
  • WPS中插入矩阵的方法
  • 专栏二十三:Python读取和分析空间数据的经验杂谈
  • D105【python 接口自动化学习】- pytest进阶参数化用法
  • 【linux】NFS实验
  • dns一般设置为多少
  • Windows安装无线打印机
  • oracle linux8.10+ oracle 23ai安装