Erstellt `SERIAL PRIMARY KEY` zwei Indizes für die Tabelle?

7

Da SERIALes sich um eine Abkürzung für handeltBIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE , sieht es so aus, als würde sich das SERIAL PRIMARY KEYverdoppeln UNIQUEund 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`)
)

Es gibt definitiv den WTF- Faktor, beide PRIMARY KEYund UNIQUE KEY idin zu sehen SHOW CREATE TABLE, aber sind das wirklich zwei physische Indizes, die ich sehe?

Sollte man die Verwendung PRIMARY KEYmit SERIALund stattdessen das Schreiben bigint unsigned NOT NULL AUTO_INCREMENT PRIMARY KEYoder die Verwendung SERIALohne Primärschlüssel auf dem Tisch vermeiden ?

Antak
quelle
2
Pfui! Melden Sie einen Fehler unter bugs.mysql.com.
Rick James
Ja, das sieht aus wie ein MySQL-Fehler ...
Amalgovinus
Ich sehe dieses Verhalten auch in 5.7.18 MySQL Community Server
Kevin
1
Das Phänomen tritt in nicht auf 10.2.14-MariaDB.
Lennart
Dies kann als Fehler angesehen werden. Der Grund liegt auf der Hand - auto_incrementmuss ein Schlüssel sein (Serverfehler 1075). Aber die Quelle ist jemandes Lasiness - es gibt Aliase serialund serial default value, und es gibt keinen Alias serial primary key...
Akina

Antworten:

1

Ich sehe dieses Verhalten auch in 5.7.18 MySQL Community Server.

Basierend auf der Ausgabe von SHOW INDEX FROM foodort wird ein doppelter Index erstellt und verwaltet:

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)

Bearbeiten: Dies passiert auch für normale Tabellen:

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)
Kevin
quelle
1
Passiert das auch für einen gewöhnlichen Tisch, dh CREATE TABLE foo ...? Wenn ja, wie lautet der Inhalt von INFORMATION_SCHEMA.TABLE_CONSTRAINTS für die Tabelle?
Lennart
@ Lennart Ja, und ich habe den Inhalt hinzugefügt, den INFORMATION_SCHEMA.TABLE_CONSTRAINTSSie angefordert haben.
Kevin
Ok, dann ist es kein Fehler SHOW ..., es entstehen zwei Einschränkungen.
Lennart