Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

adicionando exclusivo à chave estrangeira existente


Vou melhorar isso conforme eu for. O MySQL irá honrar seus desejos, até mesmo permitir que você dê um tiro no próprio pé enquanto avança:
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;

Portanto, olhe para toda a bagagem que você precisa carregar com seus upserts (leia:índices extras lentos desnecessários).

Então, se você quiser o mais enxuto possível, como mencionei nos comentários, desfaça as coisas primeiro soltando os FKs nas tabelas filhas, o referenciamento primeiro. Consulte Esta resposta .

Em seguida, solte a chave pai não exclusiva atual:
DROP INDEX index_name ON tbl_name;

Em seguida, adicione a chave exclusiva no pai. Este é o novo referenciado :
CREATE UNIQUE INDEX idxName ON tbl_name (colName);

Em seguida, adicione os FKs nos filhos (o referenciamento )
CREATE INDEX idxName ON child_tbl_name (colName);

Você pode obter os nomes das chaves show create table theTableName ou por SHOW INDEX . Use nomes novos para os novos, não importa.

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