• mysql操作 sql语句中的完整性约束有哪些,主键约束、外键约束、引用完整性约束,主键外键、唯一性


    什么是约束:约束:就是约定哪些东西能填、怎么填?哪些东西不能填?

    讲约束一般是在创建表时,对字段名进行约束,所以这里先讲如何创建表:

    前言:建表

    语法:

    create table 表名(
        字段名1 数据类型 [约束],
        字段名2 数据类型 [约束],
        ...    -- 最后一个不写,逗号
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5

    正文

    一、实体完整性约束

    在这里插入图片描述

    1. 主键约束

    主键:所有字段中唯一标识的一个字段。特点:非空、唯一,一张表只能有一个主键

    分类:

    • 自然主键:使用表中的字段作为主键(比如:身份证号)
    • 代理主键:自定义一个字段来作为主键(这个用的多,比如:id)

    语法:主要是在上面创建表中的 [约束] 处使用:字段名 数据类型 primary key

    2. 唯一性约束

    这一列的数据值要唯一(比如注册的时候,用户名不重复,但是 null 不算重复)语法为:字段名 数据类型 unique;

    3. 自增长约束

    一般自增长加在主键上,语法:字段名 数据类型 primary key auto_increment

    举例:

    -- 假如插入的时候不写字段名怎么办?比如:
    insert into user values('张三',30);
    -- 那我们知道不写字段名时,所有都需要赋值,那id怎么赋值,id是自增长的,但是我又必须赋值,怎么办,直接赋 null。但主键不能为null,所以这里的null相当于就是占位的作用
    
    • 1
    • 2
    • 3
    4. 联合主键约束

    多个字段组成的主键。联合主键没有自增长。语法:primary key(字段名1,字段名2,...)

    create table user(
    	name varchar(20),
        age int,
        primary key(name,age)
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5

    二、域完整性约束

    域:就是表中的某一个单元格,对格子的约束。

    1、非空约束:字段名 数据类型 not null

    2、数据类型约束:类型要匹配

    3、默认值约束:字段名 数据类型 default 默认值。如果给了值,就用你的值,没有就是默认值

    三、引用完整性约束

    上面两种约束都是在单表中实现的,而现在多张表怎么办?
    引用:一张表关联另一张表,两张表之间有引用关系。

    1. 外键约束

    实际开发中,如果能用逻辑外键(就是你认为这两张表有关系就行了),就不要添加外键约束。比如:

    create table emp(
    	empno int primary key,
        ename varchar(30),
        job varchar(30),
        salary double,
    );
    create table dept(
    	deptno int primary key,
        dname varchar(30),
        location varchar(30)
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    ① 上面这两张表没有任何关系,那如何加关系?----> **外键:**在一个表中加字段指向另一个表的主键。如:在 emp 中加:deptno int

    ② 在实际开发中,这样写已经足够了。因为表虽然没有外键约束,但有关系了,这就叫做逻辑外键

    那外键约束怎么写呢?

    create table emp(
    	empno int primary key,
        ename varchar(30),
        job varchar(30),
        salary double,
        deptno int,
        constraint fk_emp_dept foreign key(deptno) references dept(deptno)
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    fk_emp_dept:就是外键约束的名字。随便命名,一般是前面加 fk,emp_dept 就是哪个表指向哪个表。

    foreign key(deptno):deptno 参数,就是指定哪个字段当外键。

    references dept(deptno):dept 是外键指向哪个表。括号里面的参数就是 dept 表中的主键。

    外键约束需要注意:主表(外键指向的表叫做主表),从表(有外键的表叫做从表)

    • 主表有的,从表可以没有;但从表有的,主表必须要有。

      比如:添加(修改)数据

      insert into dept (deptno,dname,location) values(10,'研发部','金融港');   
      -- 正常运行
      
      insert into emp (empno,ename,job,salary,deptno) values(2023,'张三','java开发','20000',20);
      -- 报错
      
      • 1
      • 2
      • 3
      • 4
      • 5

    在这里插入图片描述

    • 删除主表的时候,要保证从表中没有

      比如:删除

      delete from dept where deptno = 10;
      
      -- 假如从表emp中有在部门10的员工,则删除失败,否则可以删除
      
      • 1
      • 2
      • 3

    这就是外键约束的原因,所以一般都是逻辑外键

  • 相关阅读:
    C++ Reference: Standard C++ Library reference: C Library: clocale: struct lconv
    Why does PXE boot with grub2 and UEFI fails with error “File not found“ ?
    【云备份|| 日志 day5】文件热点管理模块
    深入了解 npm
    FA_04.开发system权限的App并内置到手机系统
    MST1662,摩托车大功率闪光器
    Django常用命令
    关于websocket数据过多造成浏览器卡顿问题
    Nginx模块开发之http handler实现流量统计(入门篇)
    Go/Golang语言学习实践[回顾]教程04--安装一个Go语言的集成开发环境
  • 原文地址:https://blog.csdn.net/zhangfuping123456789/article/details/134429762