CREATE TABLE 表名 (
列名1 数据类型 [列的属性],
列名2 数据类型 [列的属性],
...
列名n 数据类型 [列的属性]
);

一、默认值
CREATE TABLE student_info (
id INT comment "学号",
name VARCHAR(20) comment "姓名",
age INT comment "年龄",
sex TINYINT comment "性别:0:男;1:女",
address VARCHAR(30) comment "家庭住址"
) COMMENT '学生基本信息表';
mysql> insert into student_info(id,name) values(1,'fossi');
Query OK, 1 row affected (0.00 sec)
mysql> select * from student_info;
+------+-------+------+------+---------+
| id | name | age | sex | address |
+------+-------+------+------+---------+
| 1 | fossi | NULL | NULL | NULL |
+------+-------+------+------+---------+
1 row in set (0.00 sec)
列名 列的类型 DEFAULT 默认值
CREATE TABLE student_info (
id INT comment "学号",
name VARCHAR(20) comment "姓名",
age INT comment "年龄",
sex TINYINT default 0 comment "性别:0:男;1:女",
address VARCHAR(30) comment "家庭住址"
) COMMENT '学生基本信息表';
mysql> insert into student_info(id,name) values(1,'fossi');
Query OK, 1 row affected (0.00 sec)
mysql> select * from student_info;
+------+-------+------+------+---------+
| id | name | age | sex | address |
+------+-------+------+------+---------+
| 1 | fossi | NULL | 0 | NULL |
+------+-------+------+------+---------+
1 row in set (0.00 sec)
mysql> alter table student_info modify address varchar(30) default '中国';
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert into student_info(id,name) values(2,'我去个地方');
Query OK, 1 row affected (0.01 sec)
mysql> select * from student_info;
+------+-----------------+------+------+---------+
| id | name | age | sex | address |
+------+-----------------+------+------+---------+
| 1 | fossi | NULL | 0 | NULL |
| 2 | 我去个地方 | NULL | 0 | 中国 |
+------+-----------------+------+------+---------+
2 rows in set (0.00 sec)

二、NOT NULL属性
列名 列的类型 NOT NULL
CREATE TABLE student_info (
id INT NOT NULL comment "学号",
name VARCHAR(20) NOT NULL comment "姓名",
age INT NOT NULL comment "年龄",
sex TINYINT default 0 comment "性别:0:男;1:女",
address VARCHAR(30) comment "家庭住址"
) COMMENT '学生基本信息表';
mysql> insert into student_info(id,name,age) values(1,'fossi',NULL);
ERROR 1048 (23000): Column 'age' cannot be null
mysql> insert into student_info(id,name) values(1,'fossi');
ERROR 1364 (HY000): Field 'age' doesn't have a default value
mysql> insert into student_info(id,name,age) values(1,'fossi',18);
Query OK, 1 row affected (0.00 sec)
mysql> select * from student_info;
+----+-------+-----+------+---------+
| id | name | age | sex | address |
+----+-------+-----+------+---------+
| 1 | fossi | 18 | 0 | NULL |
+----+-------+-----+------+---------+
1 row in set (0.00 sec)

三、UNIQUE属性
UNIQUE [约束名称] (列名1, 列名2, …)
UNIQUE KEY [约束名称] (列名1, 列名2, …)
CREATE TABLE student_info (
id INT comment "学号",
name VARCHAR(20) NOT NULL comment "姓名",
age INT NOT NULL comment "年龄",
sex TINYINT default 0 comment "性别:0:男;1:女",
address VARCHAR(30) comment "家庭住址",
UNIQUE KEY uk_id (id)
) COMMENT '学生基本信息表';
mysql> insert into student_info(id,name,age) values(1,'fossi',18);
Query OK, 1 row affected (0.00 sec)
mysql> select * from student_info;
+----+-------+-----+------+---------+
| id | name | age | sex | address |
+----+-------+-----+------+---------+
| 1 | fossi | 18 | 0 | NULL |
+----+-------+-----+------+---------+
1 row in set (0.00 sec)
mysql> insert into student_info(id,name,age) values(1,'我去个地方',20);
ERROR 1062 (23000): Duplicate entry '1' for key 'uk_id'
UNIQUE KEY uk_id_name (id,name)

四、主键
PRIMARY KEY (列名1, 列名2, …)
CREATE TABLE student_info (
id INT comment "学号",
name VARCHAR(20) NOT NULL comment "姓名",
age INT NOT NULL comment "年龄",
sex TINYINT default 0 comment "性别:0:男;1:女",
address VARCHAR(30) comment "家庭住址",
PRIMARY KEY (id)
) COMMENT '学生基本信息表';
mysql> show create table student_infoG
*************************** 1. row ***************************
Table: student_info
Create Table: CREATE TABLE `student_info` (
`id` int(11) NOT NULL COMMENT '学号',
`name` varchar(20) NOT NULL COMMENT '姓名',
`age` int(11) NOT NULL COMMENT '年龄',
`sex` tinyint(4) DEFAULT '0' COMMENT '性别:0:男;1:女',
`address` varchar(30) DEFAULT NULL COMMENT '家庭住址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='学生基本信息表'
1 row in set (0.00 sec)
mysql> insert into student_info(id,name,age) values(NULL,'我去个地方',20);
ERROR 1048 (23000): Column 'id' cannot be null
mysql> insert into student_info(name,age) values('我去个地方',20);
ERROR 1364 (HY000): Field 'id' doesn't have a default value
mysql> insert into student_info(id,name,age) values(1,'我去个地方',20);
Query OK, 1 row affected (0.00 sec)
mysql> insert into student_info(id,name,age) values(1,'我去个地方',20);
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
-
第一个问题是:主键和UNIQUE约束的区别是什么? -
第二个问题是:为什么要有主键?
-
第一点:一张表中只能定义一个主键,却可以定义多个UNIQUE约束! -
第二点:主键列不允许存放NULL,而声明了UNIQUE属性的列可以存放NULL,而且NULL可以重复地出现在多条记录中!
CREATE TABLE student_info (
id INT comment "学号",
name VARCHAR(20) NOT NULL comment "姓名",
age INT NOT NULL comment "年龄",
sex TINYINT default 0 comment "性别:0:男;1:女",
address VARCHAR(30) comment "家庭住址",
UNIQUE KEY uk_id (id)
) COMMENT '学生基本信息表';
mysql> insert into student_info(id,name,age) values(NULL,'我去个地方',20);
Query OK, 1 row affected (0.00 sec)
mysql> select * from student_info;
+------+-----------------+-----+------+---------+
| id | name | age | sex | address |
+------+-----------------+-----+------+---------+
| NULL | 我去个地方 | 20 | 0 | NULL |
+------+-----------------+-----+------+---------+
1 row in set (0.00 sec)
mysql> insert into student_info(id,name,age) values(NULL,'我去个地方',20);
Query OK, 1 row affected (0.00 sec)
mysql> select * from student_info;
+------+-----------------+-----+------+---------+
| id | name | age | sex | address |
+------+-----------------+-----+------+---------+
| NULL | 我去个地方 | 20 | 0 | NULL |
| NULL | 我去个地方 | 20 | 0 | NULL |
+------+-----------------+-----+------+---------+
2 rows in set (0.00 sec)

五、AUTO_INCREMENT属性
列名 列的类型 AUTO_INCREMENT
CREATE TABLE student_info (
id INT AUTO_INCREMENT comment "学号",
name VARCHAR(20) comment "姓名",
age INT comment "年龄",
sex TINYINT comment "性别:0:男;1:女",
address VARCHAR(30) comment "家庭住址"
) COMMENT '学生基本信息表';
mysql> CREATE TABLE student_info (
-> id INT AUTO_INCREMENT comment "学号",
-> name VARCHAR(20) comment "姓名",
-> age INT comment "年龄",
-> sex TINYINT comment "性别:0:男;1:女",
-> address VARCHAR(30) comment "家庭住址"
-> ) COMMENT '学生基本信息表';
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
mysql> CREATE TABLE student_info (
-> id INT AUTO_INCREMENT comment "学号",
-> name VARCHAR(20) comment "姓名",
-> age INT comment "年龄",
-> sex TINYINT comment "性别:0:男;1:女",
-> address VARCHAR(30) comment "家庭住址",
-> UNIQUE KEY uk_id (id)
-> ) COMMENT '学生基本信息表';
Query OK, 0 rows affected (0.03 sec)
mysql> show create table student_infoG
*************************** 1. row ***************************
Table: student_info
Create Table: CREATE TABLE `student_info` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` varchar(20) DEFAULT NULL COMMENT '姓名',
`age` int(11) DEFAULT NULL COMMENT '年龄',
`sex` tinyint(4) DEFAULT NULL COMMENT '性别:0:男;1:女',
`address` varchar(30) DEFAULT NULL COMMENT '家庭住址',
UNIQUE KEY `uk_id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='学生基本信息表'
1 row in set (0.00 sec)
mysql> insert into student_info(id,name,age) values(NULL,'学生1',20);
Query OK, 1 row affected (0.00 sec)
mysql> insert into student_info(id,name,age) values(0,'学生2',20);
Query OK, 1 row affected (0.01 sec)
mysql> insert into student_info(name,age) values('学生3',20);
Query OK, 1 row affected (0.00 sec)
mysql> select * from student_info;
+----+---------+------+------+---------+
| id | name | age | sex | address |
+----+---------+------+------+---------+
| 1 | 学生1 | 20 | NULL | NULL |
| 2 | 学生2 | 20 | NULL | NULL |
| 3 | 学生3 | 20 | NULL | NULL |
+----+---------+------+------+---------+
3 rows in set (0.00 sec)
mysql> delete from student_info where id=3;
Query OK, 1 row affected (0.00 sec)
mysql> insert into student_info(name,age) values('学生3',20);
Query OK, 1 row affected (0.00 sec)
mysql> select * from student_info;
+----+---------+------+------+---------+
| id | name | age | sex | address |
+----+---------+------+------+---------+
| 1 | 学生1 | 20 | NULL | NULL |
| 2 | 学生2 | 20 | NULL | NULL |
| 4 | 学生3 | 20 | NULL | NULL |
+----+---------+------+------+---------+
3 rows in set (0.00 sec)
alter table 表名 AUTO_INCREMENT=N;
mysql> delete from student_info where id=4;
Query OK, 1 row affected (0.00 sec)
mysql> alter table student_info auto_increment=2;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert into student_info(name,age) values('学生3',20);
Query OK, 1 row affected (0.00 sec)
mysql> select * from student_info;
+----+---------+------+------+---------+
| id | name | age | sex | address |
+----+---------+------+------+---------+
| 1 | 学生1 | 20 | NULL | NULL |
| 2 | 学生2 | 20 | NULL | NULL |
| 3 | 学生3 | 20 | NULL | NULL |
+----+---------+------+------+---------+
3 rows in set (0.00 sec)
mysql> select * from student_info;
+----+---------+------+------+---------+
| id | name | age | sex | address |
+----+---------+------+------+---------+
| 1 | 学生1 | 20 | NULL | NULL |
| 2 | 学生2 | 20 | NULL | NULL |
| 3 | 学生3 | 20 | NULL | NULL |
+----+---------+------+------+---------+
3 rows in set (0.00 sec)
mysql>
mysql> alter table student_info auto_increment=2;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert into student_info(name,age) values('学生3',20);
Query OK, 1 row affected (0.00 sec)
mysql> select * from student_info;
+----+---------+------+------+---------+
| id | name | age | sex | address |
+----+---------+------+------+---------+
| 1 | 学生1 | 20 | NULL | NULL |
| 2 | 学生2 | 20 | NULL | NULL |
| 3 | 学生3 | 20 | NULL | NULL |
| 4 | 学生3 | 20 | NULL | NULL |
+----+---------+------+------+---------+
4 rows in set (0.00 sec)
mysql> CREATE TABLE student_info (
-> id INT AUTO_INCREMENT comment "学号",
-> name VARCHAR(20) comment "姓名",
-> age INT comment "年龄",
-> sex TINYINT comment "性别:0:男;1:女",
-> address VARCHAR(30) comment "家庭住址",
-> PRIMARY key (id)
-> ) COMMENT '学生基本信息表';
Query OK, 0 rows affected (0.03 sec)
mysql> show create table student_infoG
*************************** 1. row ***************************
Table: student_info
Create Table: CREATE TABLE `student_info` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` varchar(20) DEFAULT NULL COMMENT '姓名',
`age` int(11) DEFAULT NULL COMMENT '年龄',
`sex` tinyint(4) DEFAULT NULL COMMENT '性别:0:男;1:女',
`address` varchar(30) DEFAULT NULL COMMENT '家庭住址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='学生基本信息表'
1 row in set (0.01 sec)
-
一个表中最多有一个具有AUTO_INCREMENT属性的列。 -
具有AUTO_INCREMENT属性的列必须建立索引。主键和具有UNIQUE属性的列会自动建立索引。不过至于什么是索引,在学习MySQL进阶的时候才会介绍。 -
拥有AUTO_INCREMENT属性的列就不能再通过指定DEFAULT属性来指定默认值。 -
一般拥有AUTO_INCREMENT属性的列都是作为主键的属性,来自动生成唯一标识一条记录的主键值。 -
可以看到,咱们的学生信息表已经组合使用了很多属性,同一个字段也可以使用多个属性,比如id加上了PRIMARY KEY、NOT NULL和AUTO_INCREMENT三个属性,只要不互斥就是OK的,比如主键字段不可以声明为default null,这一点需要多加注意。

六、再次回顾表结构
mysql> desc student_info;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| sex | tinyint(4) | YES | | NULL | |
| address | varchar(30) | YES | | NULL | |
+---------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
-
Filed:标识字段名称; -
Type:标识该字段的类型,主要是数值类型、字符串类型以及时间类型; -
Null:是否允许为NULL,值为NO时,表示不允许存储NULL,值为YES是表示可以存储NULL; -
Key:Key列存储关于所谓的键的信息,当值为PRI是PRIMARY KEY的缩写,代表主键;UNI是UNIQUE KEY的缩写,代表UNIQUE属性; -
Deafult:Default列代表该列的默认值; -
Extra:Extra列展示一些额外的信息。比方说如果某个列具有AUTO_INCREMENT属性就会被展示在这个列里;

七、字段命名约束
CREATE TABLE `user_address` (
`id` varchar(64) NOT NULL COMMENT '地址主键id',
`user_id` varchar(64) NOT NULL COMMENT '关联用户id',
`receiver` varchar(32) NOT NULL COMMENT '收件人姓名',
`mobile` varchar(32) NOT NULL COMMENT '收件人手机号',
`province` varchar(32) NOT NULL COMMENT '省份',
`city` varchar(32) NOT NULL COMMENT '城市',
`district` varchar(32) NOT NULL COMMENT '区县',
`detail` varchar(128) NOT NULL COMMENT '详细地址',
`extand` varchar(128) DEFAULT NULL COMMENT '扩展字段',
`is_default` int(11) DEFAULT NULL COMMENT '是否默认地址',
`created_time` datetime NOT NULL COMMENT '创建时间',
`updated_time` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户地址表 ';
-
名称见名知义:user_address是指用户地址表,比如省份、城市、区县分别使用province、city、district; -
注释齐全:即便字段名称已经含义十分清晰,但是仍然使用comment进行字段含义的说明,不会产生字段含义歧义; -
属性设置合理:明确了id为主键、明确了哪些字段一定不能为NULL; -
字段长度和类型合理:长度在满足条件的情况下尽可能设置短一点,可提高存储效率和查询效率; -
时间字段必不可少:创建时间和更新时间字段是表设计中必不可少的两个字段,往往是排查问题的重要依据; -
注意字符集选择的上正宗的utf-8字符集,即utf8mb4,如无特殊要求,一律无脑使用该字符集即可;默认引擎是InnoDB,99%工程场景都是默认使用此存储引擎,不需要考虑其他类型;
本系列文章可能存在一些demo表结构不符合以上准则,还请谅解,仅仅为了演示使用,实际工程不可随意,请不要被示例带偏。

八、总结
-
MySQL中字段属性有哪些?对应的语法分别是什么? -
主键和UNIQUE约束的特点、区别是什么? -
AUTO_INCREMENT属性的特点有哪些? -
说说DESC查看的表结构几列信息的含义是什么? -
字段命名规则有哪些注意点?
原文始发于微信公众号(幕后哈土奇):08|第八话:基础篇-MySQL之列属性
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/112875.html