聊聊MySQL表约束(学习笔记)

前段时间遇到一个小问题,后来发现这是个挺常见的坑,顺手整理一篇笔记。

@bit::Shadow

✧(≖ ◡ ≖✿ 

目录

空串与null

not null与default

NULL VS default

zerofill

desc误区

1.主键(primary Key)

1.1复合主键

1.2自增主键

自增长 auto_increment

自定义初始auto值

1.3唯一键

1.3.1理解主键、唯一键

1.3.2理解主键与业务的分离

1.4外键


空串与null

MySQL中空串''或者""与null的区别:空串代表有一个串不过其内部为空,null代表什么都没有。

在一个正常的枚举体中,当咱们插入时输入0插入,再select * from 查看就会注意到什么都没有。这其实是插入了一个错误的枚举值(正常从1动手)而显示时以空串形式显现。

not null与default

在创建表(的列成员时)咱们可根据实际需求进行选项的添加:

mysql> create table t1(age int not null comment '年龄一定不能为空',
     name varchar(20) default '张三' comment '姓名default张三',
     height smallint unsigned not null default 170
) character set utf8mb4 collate=utf8mb4_0900_ai_ci engine=innodb;

not null的约束代表此列无法插入null,default值代表当插入数据时未指定时自动设置的默认值。

mysql> insert into t1(age,height) values(18,175);
            -- name使用默认值张三 height使用指定值

注意:一旦你指定default列就必须写东西,不可以指定了default列却不写。

NULL VS default

很明显的注意到default与NULL存在优先级问题

实际一图概之:

即:default优先

zerofill

zerofill是一种东西显示方案。

mysql> create table t2(age tinyint zerofill, ag tinyint(4) zerofill);

秉持至少显示设置位个数字,缺少则补零。

desc误区

在desc查询时常常会产生误区:“类型后括号的值”限定原类型大小。

注意:类型后括号内的数据是zerofill的填充值。



1.主键(primary Key)

一个表内表示某列或某多列的属性,限制重复。

mysql> create table t3(id int primary key,
       name varchar(20) not null default '张三');

拥有主键标识的列用desc查看

注意:设置为主键的列,自动约束为“非空”。

1.1复合主键

复合主键(Composite Primary Key)就是用多个列一起组成主键,用来唯一标识一行。常见于关联表(中间表)。

注意:复合主键的设置语法异于单列主键,要在末尾统一指定。

CREATE TABLE student_course (
  student_id INT NOT NULL COMMENT '学生ID',
  course_id INT NOT NULL COMMENT '课程ID',
  score DECIMAL(5,2) COMMENT '成绩',
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '选课时间',
  PRIMARY KEY (student_id, course_id)
) ENGINE InnoDB COMMENT '学生选课表';

复合主键作用的多个列的值不能完全相同。(可部分一致)
                                                 同列看

主键的认识:主键是一个整体的概念,限制完全相同的值不会出现。

1.2自增主键

auto_increment

最常与主键搭配的约束,效果表现为每插入一个数据自增主键列值变为

自增长 auto_increment

id自增默认自‘1’动手

mysql> create table t4(id int primary key auto_increment, name char(2));

未指定id依次插入数据

当插入三个后auto_increment=4

自定义初始auto值

在engine 设置的地方可以手动指定初始值。

create table t4 (
  id int primary key auto_increment,
  name char(2)
) auto_increment = 1000;

1.3唯一键

unique

达成上的区别:像主键限制唯一性,不过主键不可以为空不过唯一键可以为空。(可以存在两个空!!!)

1.3.1理解主键、唯一键

1.主键核心体现出‘主’字,表示主从关系标识整行。(因此常设置自增,不能为空)

2.唯一键强调‘唯一性’,像QQ号、用户名。(没错就是QQ号、用户名)

1.3.2理解主键与业务的分离

易变性或者可变性决定了唯一键的用。

create table users (
  id bigint primary key auto_increment comment '主键ID',
  username varchar(50) not null unique comment '用户名,唯一',
  email varchar(100) unique comment '邮箱,唯一',
  phone char(11) unique comment '手机号,唯一',
  name varchar(20) comment '姓名',
  age int comment '年龄'
) engine InnoDB comment '用户表';

1.4外键

foreign key([从表外键列]) references 主表名

create table student(
  name char(10),
  class_id tinyint,  -- 注意此处有','
  foreign key(class_id) references class(id)
);

create table class(
  id tinyint primary key,
  name varchar(20)
) engine InnoDB;

注意:

1.主从键列类型必须完全一致,才可以建立起来。
2.在创建从表前主表必须提前创建好。(因为要指定主键联系)
3.在从表中插入行时,必须主表中存在相应联系。

感谢支持,长期连载
欢迎关注


本次分享就到这里。技术这东西越研究越有意思,后续有新的收获我也会继续更新。

评论 (0)

暂无评论