sql >> Base de Datos >  >> RDS >> Mysql

agregando clave externa única a existente

Iré mejorando esto sobre la marcha. MySQL honrará sus deseos, incluso le permitirá dispararse en el pie mientras avanza:

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;

Así que mira todo el equipaje que tienes que llevar con tus upserts (léase:lentos índices extra innecesarios).

Entonces, si desea que sea lo más simple posible, como mencioné en los comentarios, primero desenrolle las cosas colocando los FK en las tablas secundarias, las referencias primero. Consulte Esta respuesta .

Luego suelte la clave principal no única actual:

DROP INDEX index_name ON tbl_name;

Luego agregue la clave única en el padre. Este es el nuevo referenciado :

CREATE UNIQUE INDEX idxName ON tbl_name (colName);

Luego agregue los FK en los niños (la referencia )

CREATE INDEX idxName ON child_tbl_name (colName);

Puede obtener los nombres de las claves mediante show create table theTableName o por SHOW INDEX . Use nombres nuevos para los nuevos, no importa.

Tales como:

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