由于SERIAL是 的简写BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,它看起来像是SERIAL PRIMARY KEY在UNIQUE和上加倍PRIMARY KEY:
> CREATE TEMPORARY TABLE foo (id SERIAL PRIMARY KEY);
> SHOW CREATE TABLE foo \G
*************************** 1. row ***************************
Table: foo
Create Table: CREATE TABLE `foo` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
)
Run Code Online (Sandbox Code Playgroud)
肯定有同时看到和in的wtf因素,但这真的是我看到的两个物理索引吗?PRIMARY KEYUNIQUE KEY idSHOW CREATE TABLE
应该避免使用PRIMARY KEYwithSERIAL而选择 write bigint unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,还是使用SERIAL表上没有主键?
我还在 5.7.18 MySQL 社区服务器中看到了这种行为。
根据输出,SHOW INDEX FROM foo正在创建和维护一个重复索引:
mysql> CREATE TEMPORARY TABLE foo (id SERIAL PRIMARY KEY);
Query OK, 0 rows affected (0.00 sec)
mysql> show index from foo;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| foo | 0 | PRIMARY | 1 | id | A | 0 | NULL | NULL | | BTREE | | |
| foo | 0 | id | 1 | id | A | 0 | NULL | NULL | | BTREE | | |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
编辑:普通表也会发生这种情况:
mysql> CREATE TABLE foo (id SERIAL PRIMARY KEY);
Query OK, 0 rows affected (0.01 sec)
mysql> show index from foo;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| foo | 0 | PRIMARY | 1 | id | A | 0 | NULL | NULL | | BTREE | | |
| foo | 0 | id | 1 | id | A | 0 | NULL | NULL | | BTREE | | |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)
mysql> select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where TABLE_NAME = 'foo';
+--------------------+-------------------+-----------------+--------------+------------+-----------------+
| CONSTRAINT_CATALOG | CONSTRAINT_SCHEMA | CONSTRAINT_NAME | TABLE_SCHEMA | TABLE_NAME | CONSTRAINT_TYPE |
+--------------------+-------------------+-----------------+--------------+------------+-----------------+
| def | my_db | PRIMARY | my_db | foo | PRIMARY KEY |
| def | my_db | id | my_db | foo | UNIQUE |
+--------------------+-------------------+-----------------+--------------+------------+-----------------+
2 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
807 次 |
| 最近记录: |