sql >> Database >  >> RDS >> Mysql

uniek toevoegen aan bestaande externe sleutel

Ik zal dit verbeteren terwijl ik ga. MySQL zal uw wensen honoreren, u kunt zelfs uzelf in de voet schieten terwijl u bezig bent:

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;

Dus kijk eens naar alle bagage die je met je upserts mee moet nemen (lees:langzame extra onnodige indexen).

Dus als je het zo slank mogelijk wilt hebben, zoals ik al zei in opmerkingen, ontspan je eerst door de FK's in de onderliggende tabellen te laten vallen, de verwijzing eerst. Zie Dit antwoord .

Laat vervolgens de huidige niet-unieke bovenliggende sleutel vallen:

DROP INDEX index_name ON tbl_name;

Voeg vervolgens de unieke sleutel toe aan de ouder. Dit is de nieuwe verwezen :

CREATE UNIQUE INDEX idxName ON tbl_name (colName);

Voeg vervolgens de FK's toe aan de kinderen (de verwijzingen )

CREATE INDEX idxName ON child_tbl_name (colName);

U kunt de sleutelnamen verkrijgen door show create table theTableName of door SHOW INDEX . Gebruik nieuwe namen voor de nieuwe, het maakt niet uit.

Zoals:

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. Cascade bij verwijderen of triggers gebruiken?

  2. Laravel 4 Query Builder - groupBy Max Date

  3. Hoe maak je een willekeurige string die geschikt is voor een sessie-ID in PostgreSQL?

  4. Verbinding maken met Oracle 11-database vanuit . netto-