Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql表的约束

一文吃透 MySQL 表约束:类型、用法、示例与最佳实践

作者:しのみやShinomiya

MySQL表的约束就是给字段加规则,插入或修改数据时不符合规则会直接报错,用来保证数据的准确和完整,主要分为‌非空、默认、唯一、主键、外键、检查‌六大类,‌‌本文介绍mysql表的约束详解,感兴趣的朋友一起看看吧

非空约束 not null

create table myclass(
    class_name varchar(20) not null,
    class_room varchar(20) not null
);

补充几个新手容易懵的点:

alter table myclass modify class_name varchar(20) not null;

default 约束

create table tt10(
    name varchar(20) not null,
    age tinyint unsigned default 18,
    gender char(1) default '男'
);
create table t11(
    name varchar(20) not null,
    age tinyint default 18,
    gender char(1) not null default '男'
);

补充:

列描述 comment

create table t12(
    name varchar(20) not null comment '这个是用户的用户名',
    age tinyint unsigned default 18 comment '这个是用户年龄',
    gender char(1) default '男' comment '这个是用户性别'
);

补充:

show full columns from t12;

zerofill 约束

create table test_zerofill (
    id int(6) zerofill primary key,
    num tinyint(4) zerofill
);

补充:

主键约束

create table student (
    id int primary key,
    name varchar(20)
);

一句话:primary key = unique + not null

补充:

建表后加主键:

alter table student add primary key(id);

删除主键时注意:如果主键带 auto_increment,要先去掉自增,不然可能报错。

alter table student modify id int;
alter table student drop primary key;

自增主键常用写法:

create table student (
    id int primary key auto_increment,
    name varchar(20)
);

补充:自增不保证连续,删掉几行后不会自动回填。可以指定起始值:

alter table student auto_increment = 100;

联合主键:

create table score (
    student_id int,
    course_id int,
    score int,
    primary key (student_id, course_id)
);

唯一键 unique

-- 列级定义
create table user(
    id int primary key auto_increment,
    email varchar(50) unique,
    phone varchar(20)
);
-- 表级定义,支持复合唯一键
create table user(
    id int primary key auto_increment,
    username varchar(30),
    phone varchar(20),
    constraint uk_name_phone unique (username, phone)
);
-- 已存在的表加唯一约束
alter table user add constraint uk_email unique(email);
-- 删除唯一约束,本质是删对应索引
alter table user drop index uk_email;

补充:

特性主键 PRIMARY KEY唯一键 UNIQUE
数量一张表只能 1 个可以多个
NULL不允许允许,可多条 NULL
索引InnoDB 聚簇索引普通唯一二级索引
作用唯一标识一行保证业务字段不重复

外键 foreign key

外键就是两张表之间的“绳子”:子表引用主表的主键或唯一键。

create table department(
    dept_id int primary key auto_increment,
    dept_name varchar(30) not null
);
create table employee(
    emp_id int primary key auto_increment,
    emp_name varchar(30) not null,
    dept_id int,
    constraint fk_emp_dept foreign key(dept_id) references department(dept_id)
);

规则补充:

  1. 被引用的列必须是主键或唯一键。
  2. 类型要匹配,intintvarchar 长度尽量一致。
  3. MySQL 里只有 InnoDB 支持外键,MyISAM 不支持。
  4. 插入:先插主表,再插子表。
  5. 删除:先删子表,再删主表。
  6. 可以加级联操作:
constraint fk_emp_dept foreign key(dept_id) references department(dept_id)
on delete cascade
on update cascade

意思就是:主表删,子表跟着删;主表改,子表跟着改。默认是 restrict,不让乱删。

删除外键:

alter table employee drop foreign key fk_emp_dept;

忘名字就:

show create table employee;

实际开发小提示:互联网项目经常不建物理外键,靠代码层保证,因为外键有性能和管理开销。学习阶段先把原理搞懂,面试能说清楚就行。

补一个:check 约束

MySQL 8.0.16 之后开始真正支持:

create table person(
    age int check (age >= 0 and age <= 150)
);

8.0.16 之前写是能写,但会被忽略,属于“写了白写”。

最后一句总结

数据库约束就像家规:

刚开始记不住很正常,写多了就会形成条件反射:哦,这里不能空;哦,这里不能重复;哦,删主表前得先看子表。一年正是踩坑长记性的黄金期,稳住。

到此这篇关于一文吃透 MySQL 表约束:类型、用法、示例与最佳实践的文章就介绍到这了,更多相关mysql表的约束内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文