Mysql
 sql >> Base de données >  >> RDS >> Mysql

ajout unique à la clé étrangère existante

Je vais améliorer cela au fur et à mesure. MySQL honorera vos souhaits, vous permettant même de vous tirer une balle dans le pied au fur et à mesure :

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;

Alors regardez tous les bagages que vous avez à transporter avec vos upserts (lire :ralentissez les index supplémentaires inutiles).

Donc, si vous le voulez aussi léger que possible, comme je l'ai mentionné dans les commentaires, déroulez d'abord les choses en supprimant les FK dans les tables enfants, le référencement première. Voir Cette réponse .

Déposez ensuite la clé parent non unique actuelle :

DROP INDEX index_name ON tbl_name;

Ajoutez ensuite la clé unique dans le parent. C'est le nouveau référencé :

CREATE UNIQUE INDEX idxName ON tbl_name (colName);

Ajoutez ensuite les FK dans les enfants (le référencement )

CREATE INDEX idxName ON child_tbl_name (colName);

Vous pouvez obtenir les noms de clé en show create table theTableName ou par SHOW INDEX . Utilisez de nouveaux noms pour les nouveaux, cela n'a pas d'importance.

Tels que :

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      |         |               |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+