Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Hinzufügen eines eindeutigen zu einem vorhandenen Fremdschlüssel

Ich werde dies verbessern, wenn ich gehe. MySQL wird Ihren Wünschen nachkommen und Ihnen sogar erlauben, sich dabei selbst ins Knie zu schießen:

create table t9
(
    id int auto_increment primary key,
    thing varchar(20) not null,
    key(thing),
    unique key (thing),
    unique key `yet_another` (thing)
);
-- warning 1831 dupe index
show create table t9;
CREATE TABLE `t9` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `thing` varchar(20) NOT NULL,
   PRIMARY KEY (`id`),
   UNIQUE KEY `thing_2` (`thing`),
   UNIQUE KEY `yet_another` (`thing`),
   KEY `thing` (`thing`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Sehen Sie sich also all das Gepäck an, das Sie mit Ihren Upserts herumtragen müssen (sprich:langsame, unnötige Extra-Indexe).

Wenn Sie es also so schlank wie möglich wollen, wie ich in den Kommentaren erwähnt habe, wickeln Sie die Dinge zuerst ab, indem Sie die FKs in den untergeordneten Tabellen, der Referenzierung, ablegen Erste. Siehe Diese Antwort .

Löschen Sie dann den aktuellen nicht eindeutigen übergeordneten Schlüssel:

DROP INDEX index_name ON tbl_name;

Fügen Sie dann den eindeutigen Schlüssel im übergeordneten Element hinzu. Dies ist die neue referenzierte :

CREATE UNIQUE INDEX idxName ON tbl_name (colName);

Fügen Sie dann die FKs in den Kindern hinzu (die Referenzierung )

CREATE INDEX idxName ON child_tbl_name (colName);

Sie können die Schlüsselnamen erhalten, indem Sie show create table theTableName anzeigen oder durch SHOW INDEX . Verwenden Sie neue Namen für die neuen, es spielt keine Rolle.

Zum Beispiel:

mysql> show index from t9;
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name    | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| t9    |          0 | PRIMARY     |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| t9    |          0 | thing_2     |            1 | thing       | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| t9    |          0 | yet_another |            1 | thing       | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| t9    |          1 | thing       |            1 | thing       | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+