Mysql
 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;

Така че вижте целия багаж, който трябва да носите с вашите upserts (прочетете:бавни допълнителни ненужни индекси).

Така че, ако искате да е възможно най-просто, както споменах в коментарите, първо отпуснете нещата, като пуснете 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP MySQLi Заявка между два пъти от самата заявка

  2. искам да извлека общия брой потребители на дадени идентификатори на реферали в таблицата

  3. Laravel db миграция - грешка при преименуване на колона - Неизвестен тип база данни е поискано изброяване

  4. Какво би се случило, ако 2 или повече души се опитат да актуализират една и съща MySQL таблица по едно и също време?

  5. MySQL заявка годишна седмица от текущата седмица да започне в четвъртък, да завърши в сряда