sql >> データベース >  >> RDS >> Mysql

既存の外部キーに固有の追加

    私は行くにつれてこれを改善します。 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      |         |               |
    +-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
    


    1. MySQLの数値にはTOPX(または下)パーセントを選択します

    2. メッセージングシステムデータベーススキーマ

    3. 列を削除しても列参照が完全に削除されるわけではありません-postgresql

    4. Ectoに生のSQLをログに記録させることはできますか?