私は行くにつれてこれを改善します。 MySQLはあなたの願いを尊重し、あなたが行くときに足で自分自身を撃つことさえ可能にします:
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;
だから、あなたがアップサートと一緒に持ち歩く必要があるすべての荷物を見てください(読んでください:余分な不要なインデックスを遅くしてください)。
したがって、コメントで述べたように、できるだけスリムにしたい場合は、最初に子テーブルにFKをドロップして、参照して物事をほどきます。 最初。 この回答 をご覧ください 。
次に、現在の一意でない親キーを削除します。
DROP INDEX index_name ON tbl_name;
次に、親に一意のキーを追加します。これは新しい参照です :
CREATE UNIQUE INDEX idxName ON tbl_name (colName);
次に、子にFKを追加します(参照 )
CREATE INDEX idxName ON child_tbl_name (colName);
キー名は、show create table theTableName
で取得できます。 またはSHOW INDEX
。新しい名前には新しい名前を使用してください。問題ではありません。
例:
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 | | |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+