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

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

文章目录

      • 前言:建表
      • 正文
      • 一、实体完整性约束
        • 1. 主键约束
        • 2. 唯一性约束
        • 3. 自增长约束
        • 4. 联合主键约束
      • 二、域完整性约束
      • 三、引用完整性约束
        • 1. 外键约束

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

前言:建表

语法:

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

正文

一、实体完整性约束

mysql操作 sql语句中的完整性约束有哪些,主键约束、外键约束、引用完整性约束,主键外键、唯一性_第1张图片

1. 主键约束

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

分类:

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

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

2. 唯一性约束

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

3. 自增长约束

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

举例:

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

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

create table user(
	name varchar(20),
    age int,
    primary key(name,age)
)

二、域完整性约束

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

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

① 上面这两张表没有任何关系,那如何加关系?----> **外键:**在一个表中加字段指向另一个表的主键。如:在 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)
)

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

mysql操作 sql语句中的完整性约束有哪些,主键约束、外键约束、引用完整性约束,主键外键、唯一性_第2张图片

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

    比如:删除

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

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

你可能感兴趣的:(MySQL,mysql,sql,数据库)