目录
- 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
- Default 与 Not 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