约束名称 | 描述 |
---|---|
primary key | 主键约束,非空、唯一(不能重复)、索引 |
auto_increment | 自增 |
unique | 唯一键 |
foreign key | 外键 |
null / not null | 空/非空约束 |
default | 默认值(缺省值) |
zerofill | 零填充 |
comment | 列描述 (用于描述属性字段的) |
主键(PRIMARY KEY)的完整称呼是“主键约束”,是 MySQL中使用最为频繁的约束。一般情况下,为了便于 DBMS 更快的查找到表中的记录,都会在表中设置一个主键。
注意:
①: 创建表的时候,在字段名后指定primary key
create table 表名(id int primary key, name varchar(30));
②: 创建表的最后,指定某列或某几列为主键索引
create table 表名(
id int,
name varchar(30),
primary key(id, name)
);
③: 创建表完成后,再添加主键
create table 表名(id int, name varchar(30));
alter table 表名 add primary key(id);
alter table 表名 drop primary key;
它需要配合主键使用,有个这个约束,我们在向表中插入数据时,不需要额外关心主键的数据,他会自动帮我们维护一个递增的主键(系统会从当前字段中已有的最大值+1操作)。
特点:
mysql> create table test(
-> id int unsigned primary key auto_increment,
-> name varchar(10) not null default ''
-> );
• 查看auto_increment值
show create table table_name; -- 可以查看auto_increment的值(下一次的插入的值)
唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。
主键与唯一键的区别:
主键更多的是标识一条记录的唯一性,并且主键也有作为索引的key值的作用。
唯一键则是保证在业务上该字段的唯一性,为了防止其它字段插入相同的该字段的值。
①: 创建表时,在某一字段后直接指定unique唯一索引
create table 表名(id int primary key, name varchar(30) unique);
②: 创建表的最后,在表的最后面指定某列或某几列为unique
create table 表名(
id int primary key,
name varchar(30),
unique(name)
);
③: 表创建完成后,再对表进行修改,设置唯一键
create table 表名(id int primary key, name varchar(30));
alter table 表名 add unique(name);
-- 1
alter table 表名 drop index 字段名;
-- 2
drop index 字段名 on 表名;
外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
• 创建表时,在最后添加外键
foreign key(外键字段名) references 主表(主表字段名)
create table class(
id int primary key,
name varchar(20) comment '班级名称'
);
create table student(
id int primary key,
name varchar(20) comment '学生名',
class_id int comment '班级表的id',
foreign key(class_id) references class(id) -- 创建外键
);
• 表创建完成后,添加外键
alter table 表名 add [constraint 外键名] foreign key(外键字段名) references 主表(主表字段名)
注意: 上面"[]"里面的是可以不写的。自己不对外键起名字的话,MySQL会自动帮忙生成。
alter table student add foreign key(class_id) references class(id);
删除外键,必须要知道外键的名称。(只要不是主键索引,其它索引的删除都需要知道索引名称)
Table: tmp
Create Table: CREATE TABLE `tmp` (
`SNO` int(11) NOT NULL,
`CNO` int(11) DEFAULT NULL,
`GRADE` decimal(5,2) DEFAULT NULL,
KEY `fk_cno` (`CNO`),
KEY `fk_sno` (`SNO`),
CONSTRAINT `tmp_ibfk_1` FOREIGN KEY (`CNO`) REFERENCES `C` (`CNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
这里的tmp_ibfk_1
就是外键名称。我们一会使用的删除操作必须用到这个名字。
alter table 表名 drop foreign key 外键名;
mysql> create table myclass(
-> class_name varchar(20) not null,
-> class_room varchar(10) not null
-> );
(非空属性可以配合缺省值一起使用)
• 空字段的性质
空字段是不参与运算的,包括比较。
mysql> select null;
+------+
| NULL |
+------+
| NULL |
+------+
1 row in set (0.00 sec)
mysql> select 1+null;
+--------+
| 1+null |
+--------+
| NULL |
+--------+
1 row in set (0.00 sec)
默认值就是用户不输入该字段的数据时,默认采取的值。
mysql> create table test(
-> id int(8) zerofill primary key,
-> name varchar(20) comment '姓名',
-> gender varchar(10) default '保密' comment '性别'
-> );
mysql> desc test;
+--------+--------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------------------+------+-----+---------+-------+
| id | int(8) unsigned zerofill | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
| gender | varchar(10) | YES | | 保密 | |
+--------+--------------------------+------+-----+---------+-------+
对于数字类型的后面给定的长度大小,是需要配合zerofill属性一起使用的。
-- 创建的表见"6. 默认值"
mysql> insert into test values
mysql> (1,'张三','男'),
mysql> (123456789,'李四','女');
mysql> select * from test;
+-----------+--------+--------+
| id | name | gender |
+-----------+--------+--------+
| 00000001 | 张三 | 男 | -- 表的id设置的宽度为8,不足8位长度的会在前面补0
| 123456789 | 李四 | 女 |
+-----------+--------+--------+
zerofill的作用: 如果宽度小于设定的宽度,那么它会自动填充0。(注意,它这里只是在显示上给你显示的是前面有很多0,实际上在MySQL数据存储中还是1,它只是一种格式化输出)
使用comment
在创建表时,在某一字段后面添加列描述。
mysql> show create table test \G
*************************** 1. row ***************************
Table: test
Create Table: CREATE TABLE `test` (
`id` int(8) unsigned zerofill NOT NULL,
`name` varchar(20) DEFAULT NULL COMMENT '姓名',
`gender` varchar(10) DEFAULT '保密' COMMENT '性别',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8