目录

  • 1、主键约束 Primary Key
  • 2、外键约束 Foreign Key
  • 3、唯一约束 Unique
  • 4、非空约束 Not Null
  • 5、默认值 Default
  • 6、值自增 Auto_Increment
  • 7、使用 0 填充显示空白 Zerofill


1、主键约束 Primary Key


  • 主键约束相当于:唯一约束 + 非空约束的组合,主键约束的字段不允许重复,也不允许出现空值;
  • 每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别创建;
  • 主键可以由一个列组成,也可以有多个列组成;
  • 当创建主键的约束时,系统默认会在所在的列或列组合上建立对应的唯一索引。

1)列级创建主键

create table `demo` (
	`id` int(4) primary key,
    `name` varchar(20)
);

2)表级创建主键

-- 单列主键
create table `demo` (
	`id` int(4),
    `name` varchar(20),
    primary key(`id`)
);

-- 多列组合主键
create table `demo` (
	`id` int(4),
    `name` varchar(20),
    `phone` varchar(18),
    primary key(`id`, `name`)
);

3)删除主键约束

alter table `demo` drop primary key;

4)添加主键约束

alter table `demo` add primary key(`id`, `phone`);

5)修改主键约束

alter table `demo` modify `id` int(4) primary key;



2、外键约束 Foreign Key


  • 外键约束的作用是保证一个或两个表之间的参照完整性;
  • 外键约束可以单列约束,也可以多列外键组合,多列外键组合时,主表被引用的字段必须使用标记约束语法。

1)单列外键约束

-- 主表
create table `main`(
	`id` int(4) primary key,
    `name` varchar(10)
);

-- 从表
create table `slave`(
	`id` int(4) primary key,
    `phone` varchar(16),
    `main_id` int(4),
    foreign key(`main_id`) references `main`(`id`)
);

2)多列外键组合约束

-- 主表:必须使用表级约束语法
create table `main`(
	`id` int(4) primary key,
    `name` varchar(10),
    `sex` tinyint(2),
    primary key(`name`, `sex`)
);

-- 从表
create table `slave`(
	`id` int(4) primary key,
    `phone` varchar(16),
    `main_name` varchar(10),
    `main_sex` tinyint(2),
    -- 表级别联合外键
    foreign key(`main_name`, `main_sex`) references `main`(`name`, `sex`)
);

3)删除外键约束

alter table `slave` drop foreign key `main_id`;

4)增加外键约束

alter table `slave` add foreign key(`main_name`, `main_sex`) references `main`(`name`, `sex`);



3、唯一约束 Unique


  • 唯一约束的作用是指定列或列组合不能重复,保证数据的唯一性;
  • 唯一约束不允许出现重复的值,但是可以为多个 null
  • 同一张表中可以有多个单列唯一约束和多个多列组合的唯一约束
  • 在创建唯一约束时,如果不给唯一约束名称,就默认和列名相同;
  • 唯一约束不仅可以在一个表内创建,而且可以同时多表创建组合唯一约束。

1)创建单列唯一约束

create table `demo`(
	`id` int(4) primary key,
    `name` varchar(10),
    -- unique 或 unique key
    unique key `uni_name` (`name`)
);

2)创建多列组合的唯一约束

create table `demo`(
	`id` int(4) primary key,
    `name` varchar(10),
    `phone` varchar(16),
    -- name 和 phone 构成唯一
    unique key `uni_name_phone` (`name`, `phone`)
);

3)添加唯一约束

alter table `demo` add unique `uni_name` (`name`);

4)修改唯一约束字段的属性:类型、长度、大小等

alter table `demo` modify `name` varchar(30) unique;

5)删除唯一约束

alter table `demo` drop index `name`;



4、非空约束 Not Null


  • 非空约束用于确保当前列的值不为空值(null);
  • NULL 类型特征: 所有的类型的值都可以是 null,包括 int、float 等数据类型;
  • 所有不加 not null 的列都是默认为 null
  • Primary Key 主键的列一定是非空的,可以不用加非空约束。

1)创建非空约束

create table `demo`(
	`id` int(4) primary key,
    `name` varchar(10) not null
);

2)添加非空约束

alter table `demo` modify `name` varchar(10) not null;

3)取消非空约束

-- null 可以省略
alter table `demo` modify `name` varchar(10) null;



5、默认值 Default


  • 默认值的作用是当字段没有 set 值时,会使用提供的默认值进行填充字段值;
  • TEXT(包括 LONGTEXT 等)、JSON 类型的字段不支持默认值;
  • 如果字段值允许为 null 并没有指定 default 值时,默认添加 default null

1)建表时设置默认值

create table `demo`(
	`id` int(4) primary key,
    `gender` varchar(10) default 'man'
);

2)删除默认值

alter table modify `gender` varchar(10);

3)添加默认值

alter table modify `gender` varchar(10) default 'man';

4)修改默认值

alter table modify `gender` varchar(10) default 'woman';



Default 与 Not Null

  • DefaultNot Null 之间的约束范围是互相独立;
  • Default 的意思是,如果你没有对这个字段进行 set 值,那么就会使用该默认值,而 Not Null 的意思是,当你对这个字段进行 set 值时,不能设置为 null 值。

1)没有 default 和 not null

create table `demo`(
    `name` varchar(10)
);

当既没有 default 也没有 not null 时,则为:允许 null 值,默认值为 null。相当于默认添加了 null default null

2)只有 default 没有 not null

create table `demo`(
    `name` varchar(10) default 'Jack'
);

没有 not null 则默认为允许 null 值,所以,当添加数据时,如果该字段设置值,则使用所设置的值,哪怕值为 null 都可以;如果该字段没有设置值,则使用 default 值。

3)只有 not null 没有 default

create table `demo`(
    `name` varchar(10) not null
);

没有指定 default 值的都默认为 default null,但 not null 又约束该字段不能为 null 值,所以,当添加数据时,该字段必须 set 一个不为 null 的值,否则默认填充的 null 值会和 not null 约束冲突从而报错。

4)既有 default 也有 not null

create table `demo`(
    `name` varchar(10) not null default 'Jack'
);

两者皆有时表示,当添加数据时,如果不设置该字段的值时,则使用 default 值;如果设置该字段值时,不能设置为 null 值,也就是说,SQL 语句中不能出现 name = null



6、值自增 Auto_Increment


  • 每次执行 INSERT 数据插入时,自动对该字段增量;
  • Auto_increment 修饰的字段类型必须是数值型:int、float 等;
  • Auto_increment 修饰的字段类型必须是一个 key,即索引列可以是主键、唯一键、普通索引)。

1)主键自增

CREATE TABLE `demo`(
	`id` INT(4) AUTO_INCREMENT PRIMARY KEY,
	`phone` VARCHAR(10),
);

2)索引键自增

CREATE TABLE `demo`(
	`id` INT(4) PRIMARY KEY,
	`number` INT(6) AUTO_INCREMENT,
    KEY `idx_nu` (`number`)
);

3)取消自增

alter table `demo` modify `number` int(6);



7、使用 0 填充显示空白 Zerofill


  • 必须紧跟在数值类型(INT、FLOAT)之后,表示该字段的实际数值显示长度小于指定的数值长度时,使用0来填充。

创建空白 0 填充:

CREATE TABLE `demo`(
	`id` INT(4) PRIMARY KEY,
	`number` INT(10) ZEROFILL
);

数据会显示如下:

id      number  
------  ------------
     1    0000000001