08|第八话:基础篇-MySQL之列属性

还记得我们第三话03|第三话:基础篇-MySQL数据库和表的基本操作》中创建表的语句吗?我们是按照如下格式去创建一张表的:
CREATE TABLE 表名 (
    列名1    数据类型    [列的属性],
    列名2    数据类型    [列的属性],
    ...
    列名n    数据类型    [列的属性]
);
当时我们是这么说的:如果有需要的话,可以给这些列定义一些列的属性,比如不许存储NULL,设置默认值等等,本篇文章我们来细聊下列属性这个话题。
本文整体脉络如下:

08|第八话:基础篇-MySQL之列属性

08|第八话:基础篇-MySQL之列属性

一、默认值

还记得第四话04|第四话:基础篇-MySQL简单的增删改查操作》中简单的数据插入语法吗?我们仍然以学生信息表为例,我们将之前的表丢弃,重新创建新表:
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)
可以看到,由于我们只对id和name两个字段进行了赋值,而age、sex、address三个字段由于本身没有指定任何值,因此默认为NULL,NULL的含义是这个列的值还没有被设置。如果我们不想让默认值为NULL,而是设置成某个有意义的值,可以在定义列的时候给该列增加一个DEFAULT属性,就像这样:
列名 列的类型 DEFAULT 默认值
比如我们对sex字段设置默认值0,即表示默认是男生,我们可以在创建这张表的时候指定该字段的默认值为0,示例如下:
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 '学生基本信息表'
;
此时仍然对id和name两个字段赋值,此时可以看到sex被默认指定为了0:
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)
如果表已经被创建,此时又想给某个字段设置默认值也十分简单,毕竟我们第三话03|第三话:基础篇-MySQL数据库和表的基本操作中已经学习了如何修改表结构,假设我们此时修改学生信息表中的地址address字段默认为“中国”:
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)
此时尝试插入学生“我去个地方”,他的地址默认被指定为了中国。
08|第八话:基础篇-MySQL之列属性

二、NOT NULL属性

有些字段我们不方便设置默认值,比如年龄字段,但是学校要求录入数据的时候,要求id、name、年龄三个字段不能为空,即每个学生都要填,否则这条数据就不能入库,此时该怎么办呢?可以用这样的语法来定义这个列:
列名 列的类型 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 '学生基本信息表'
;
这里设置了id、name、age三个字段为NOT NULL属性,我们就必须为这三个字段赋值,我们不可以再向这三个字段任意一个赋值为NULL了:
mysql> insert into student_info(id,name,age) values(1,'fossi',NULL);
ERROR 1048 (23000): Column 'age' cannot be null
看到报了个错,提示age列不能存储NULL。
同时,一旦对某个列定义了NOT NULL属性,那这个列的默认值就不为NULL了。我们必须显式的指定这个列的值,而不能省略它,比如故意忽略对age的赋值:
mysql> insert into student_info(id,name) values(1,'fossi');                     
ERROR 1364 (HY000): Field 'age' doesn't have a default value
可以看到,报错提示是age没有一个默认值,我们必须为这个age也赋上除了NULL以外有意义的值。
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)
终于完成了一条数据的正确插入!
08|第八话:基础篇-MySQL之列属性

三、UNIQUE属性

有的时候我们希望某个字段或某些字段的组合是不重复的,比如我们希望学生表的id是不重复的,可以用这样的形式来声明:
UNIQUE [约束名称] (列名1, 列名2, …)
或者:
UNIQUE KEY [约束名称] (列名1, 列名2, …)
约束名称可以随便取,不指定也是可以的,比如我们约定id列不允许重复,我们这样指定:
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 '学生基本信息表'
;
如果表中为某个列或者列组合定义了UNIQUE属性的话,MySQL会对我们插入的记录做校验,如果新插入记录在该列或者列组合的值已经在表中存在了,那就会报错!由于我们给id设置了唯一性限制,那么重复的id自然也就无法被重复插入数据库:
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'
这里提示报错1是个重复值,不允许被再使用到id这个列上了。
也可以对组合列做不可重复的限制,比如id和name组合起来作为不可重复的校验字段,我们只需要设置为:
UNIQUE KEY uk_id_name (id,name)
一旦发现id和name组合重复,该条数据就不可插入数据库中。
08|第八话:基础篇-MySQL之列属性

四、主键

说完了UNIQUE属性,这里接着说说主键,主键全称“主键约束”,是一个列或多列的组合,其值能唯一地标识表中的每一行。
我们以学生信息表为例,读者朋友觉得哪个字段适合作为主键呢?地址可能会重复,年龄可能都相仿,性别也只能区分约一半学生,而姓名也可能有重复。这些字段都不大合适作为唯一表示一个学生的“凭证”。
或者读者朋友会想,增加一个身份证号这个字段,通过身份证号就可以唯一地表示一个学生,是的,确实如此,不过我们这里还有一个学号,实际上也是比较合适的选择。
一个班级差不多三四十个学生,从1开始编号,每个学生都不重复,是不是满足了我们这里的唯一标识一个学生的需求?
那么选择好id作为唯一标识,我们如何将其设置为主键呢?语法是:
PRIMARY KEY (列名1, 列名2, …)
我们删除之前的表,重新创建此表(注意,这里我故意去除了id的NOT 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 "家庭住址",
    
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)
我们发现,id被设置为主键后,也附带了NOT NULL的默认属性,且由于主键是用来唯一标识一行记录的,因此也天生具备UNIQUE属性,我们来观察下面示例:
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'
第一个说的是不能给主键id赋值为NULL,第二个说的是不能忽略主键id的赋值,第三个说的是主键id不可重复赋值。
此外,从主键的声明语法中可以看出,也可以是多个列的组合作为主键,这里就不举例详细说明了。
学习到这里,我们不忙着继续下一个知识点的学习,停下来思考下,或许有两个问题萦绕心头:
  • 第一个问题是:主键和UNIQUE约束的区别是什么?
  • 第二个问题是:为什么要有主键?
我们先来聊聊第一个问题,说说主键和UNIQUE约束的区别是什么?大概有如下的区别:
  • 第一点:一张表中只能定义一个主键,却可以定义多个UNIQUE约束!
  • 第二点:主键列不允许存放NULL,而声明了UNIQUE属性的列可以存放NULL,而且NULL可以重复地出现在多条记录中!
关于第一点,MySQL数据库规范中规定每张表中都需要设置主键,但是只能设置一个主键,这么规定是有原因的。
首先,唯一标识表中每行的这个列(或这组列)称为主键。没有主键,更新或删除表中特定行很困难,因为没有安全的方法保证只涉及相关的行。
然后,主键还跟索引有很大的关联,这个我们在后面进阶篇中学习索引的时候我们细说。现阶段只要知道这么个结论就好,尤其是我们在设计表结构的时候,请一定要指定一个主键(如果这个主键带有自增特性那就更完美了,类似1、2、3这样的,比如下面要讲到的自增ID,或者带有时间自增特性的字符串,至于为什么,这又跟索引有关系,不是现阶段所要理解的范畴了),这是一个值得肯定的行为。
关于第二点,我们仍然使用如下表结构做验证,我们对id做UNIQUE约束:
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 '学生基本信息表'
;
我们对号称UNIQUE的id字段重复赋予NULL值试试:
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)
我们惊奇地发现竟然全部插入成功了!
一个表的某个列声明了UNIQUE属性,那这个列的值不就不可以重复了么,为啥NULL这么特殊?NULL其实并不是一个值,它代表不确定,我们平常说某个列的值为NULL,意味着这一列的值尚未被填入。而被设置为主键的id则不可以赋予NULL,更不可以重复赋予NULL值。
08|第八话:基础篇-MySQL之列属性

五、AUTO_INCREMENT属性

AUTO_INCREMENT翻译过来叫做自动增长,简称自增,被赋予这个属性的字段叫做自增字段。
如果一个表中的某个列的数据类型是整数类型或者浮点数类型,那么这个列可以设置AUTO_INCREMENT属性。
当我们把某个列设置了AUTO_INCREMENT属性之后,如果我们在插入新记录的时候不指定该列的值,或者将该列的值显式地指定为NULL或者0,那么新插入的记录在该列上的值就是当前该列的最大值加1后的值。
AUTO_INCREMENT属性声明语法为:
列名 列的类型 AUTO_INCREMENT
我们仍然以学生信息表为例,我们将id设置为自增,看看有什么样的效果,我们将之前的表丢弃,重新创建新表:
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
说这里是错误的表定义,只能有一个自增列,并且他必须被定义为一个key,这里说的key并没有指定是UNIQUE KEY还是PRIMARY KEY,那我尝试使用UNIQUE KEY看看能不能解决此报错。
修改建表语句,将id设置为UNIQUE 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)
可以看到,完美体现了自增属性的特征,从1开始递增,并且我们不需要关心id如何设置,也不需要担心它会重复,是不是十分方便?
如果此时删除id=3的数据,再次插入一遍,id会是3还是4呢?
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)
可以看到,虽然id=3的数据被删除了,但是重新插入数据的时候,id还是从4开始递增了。如果我们需要干预自增的值,其实我们可以使用如下语句:
alter table 表名 AUTO_INCREMENT=N;
这里再次删除id=4的数据,执行如上语句,将AUTO_INCREMENT设置为2,重新插入一条数据,看id是否为3:
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)
通过这个方法我们重置了id自增的当前最大值,目前id为3,此时我再次将AUTO_INCREMENT设置为2,会报错吗,看下面实验:
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)
看来主要还是以当前id最大值为准,因此不会因为auto_increment设置错误导致id自增字段出现重复错误。
我们上面设置的是UNIQUE KEY,其实一般情况下,我们会将主键字段设置为auto_increment属性
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)
使用方式同上,只是在很多工程设计中,我们往往会使用自增id作为主键,而不是应用在UNIQUE KEY上。
结合以上示例,在为列定义AUTO_INCREMENT属性的时候需要注意这几点:
  • 一个表中最多有一个具有AUTO_INCREMENT属性的列。
  • 具有AUTO_INCREMENT属性的列必须建立索引。主键和具有UNIQUE属性的列会自动建立索引。不过至于什么是索引,在学习MySQL进阶的时候才会介绍。
  • 拥有AUTO_INCREMENT属性的列就不能再通过指定DEFAULT属性来指定默认值
  • 一般拥有AUTO_INCREMENT属性的列都是作为主键的属性,来自动生成唯一标识一条记录的主键值。
  • 可以看到,咱们的学生信息表已经组合使用了很多属性,同一个字段也可以使用多个属性,比如id加上了PRIMARY KEY、NOT NULL和AUTO_INCREMENT三个属性,只要不互斥就是OK的,比如主键字段不可以声明为default null,这一点需要多加注意。
08|第八话:基础篇-MySQL之列属性

六、再次回顾表结构

我们再次查看学生信息表的表结构:
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属性就会被展示在这个列里;
08|第八话:基础篇-MySQL之列属性

七、字段命名约束

表名、字段名称请务必不要随心所欲乱起一通,不要使用全数字、带有空白字符或者MySQL保留字的名称。
比方说CREATE、DATABASE、INT、DOUBLE、DROP、TABLE等等这些单词,这些单词都是供MySQL内部使用的,称之为保留字。
由于MySQL是C语言实现的,所以在名称定义上还是尽量遵从C语言的规范,就是用小写字母、数字、下划线、美元符号等作为名称,如果有多个单词的话,各个单词之间用下划线连接起来,尽可能做到见名知义!比如student、student_info、student_name、steudent_address等等。
以用户收获地址表为例,表结构参考模板:
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表结构不符合以上准则,还请谅解,仅仅为了演示使用,实际工程不可随意,请不要被示例带偏。
08|第八话:基础篇-MySQL之列属性

八、总结

本文学习了几个重要的列属性,核心关注的问题有:
  • MySQL中字段属性有哪些?对应的语法分别是什么?
  • 主键和UNIQUE约束的特点、区别是什么?
  • AUTO_INCREMENT属性的特点有哪些?
  • 说说DESC查看的表结构几列信息的含义是什么?
  • 字段命名规则有哪些注意点?

原文始发于微信公众号(幕后哈土奇):08|第八话:基础篇-MySQL之列属性

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/112875.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!