sql >> Databasteknik >  >> RDS >> Mysql

lägga till unik för befintlig främmande nyckel

Jag kommer att förbättra detta allt eftersom. MySQL kommer att uppfylla dina önskemål, till och med låta dig skjuta dig själv i foten när du går:

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;

Så titta på allt bagage du har att bära runt med dina upserts (läs:långsamma extra onödiga index).

Så om du vill ha det så magert som möjligt, som jag nämnde i kommentarerna, varva ner saker först genom att släppa FK:erna i underordnade tabellerna, referensen först. Se Detta svar .

Släpp sedan den aktuella icke-unika överordnade nyckeln:

DROP INDEX index_name ON tbl_name;

Lägg sedan till den unika nyckeln i föräldern. Detta är den nya referens :

CREATE UNIQUE INDEX idxName ON tbl_name (colName);

Lägg sedan till FK:erna i barnen (referensen )

CREATE INDEX idxName ON child_tbl_name (colName);

Du kan få nyckelnamnen genom att show create table theTableName eller av SHOW INDEX . Använd nya namn för de nya, det spelar ingen roll.

Såsom:

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. Kan någon förklara hur Postgresql-roller, Postgresql-användare och Linux-användare relaterar till varandra?

  2. Driver.getConnection hänger sig med SQLServer-drivrutinen och Java 1.6.0_29

  3. MySQL:Hur infogar man en post för varje resultat i en SQL-fråga?

  4. PHP echo SQL Count