Có phải `SERIAL PRIMARY KEY` tạo hai chỉ mục trên bảng không?


7

SERIALlà viết tắt choBIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE , có vẻ như SERIAL PRIMARY KEYtăng gấp đôi trên UNIQUEPRIMARY 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`)
)

Chắc chắn có yếu tố wtf khi nhìn thấy cả hai PRIMARY KEYUNIQUE KEY idtrong SHOW CREATE TABLE, nhưng đó có thực sự là hai chỉ số vật lý mà tôi đang nhìn thấy?

Có nên tránh sử dụng PRIMARY KEYvới SERIALvà thay vào đó chọn viết bigint unsigned NOT NULL AUTO_INCREMENT PRIMARY KEYhoặc sử dụng SERIALkhông có khóa chính trên bàn không?


2
Ừ! Gửi một lỗi tại bug.mysql.com.
Rick James

Vâng, điều này trông giống như một lỗi mysql ...
Amalgovinus

Tôi cũng thấy hành vi này trong 5.7,18 Máy chủ cộng đồng MySQL
Kevin

1
Các hiện tượng không xảy ra trong 10.2.14-MariaDB.
Lennart

Điều này có thể được coi là một lỗi. Lý do của nó là rõ ràng - auto_incrementphải là một khóa (lỗi máy chủ 1075). Nhưng nguồn gốc là sự sáng suốt của ai đó - có những bí danh serialserial default value, và không có bí danh nào serial primary key...
Akina

Câu trả lời:


1

Tôi cũng thấy hành vi này trong 5.7,18 Máy chủ cộng đồng MySQL.

Dựa trên đầu ra từ SHOW INDEX FROM foođó, có một chỉ mục trùng lặp được tạo và duy trì:

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)

Chỉnh sửa: Điều này cũng xảy ra đối với các bảng bình thường:

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)

1
Điều này có xảy ra đối với một bảng thông thường không, tức là CREATE TABLE foo ...? Nếu vậy, nội dung của Information_SCHema.TABLE_CONSTRAINTS cho bảng là gì?
Lennart

@Lennart Có, và tôi đã thêm nội dung INFORMATION_SCHEMA.TABLE_CONSTRAINTSmà bạn yêu cầu.
Kevin

Ok, vậy thì nó không phải là một lỗi trong SHOW ..., nó tạo ra hai ràng buộc.
Lennart
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.