Mysql
 sql >> Baza danych >  >> RDS >> Mysql

dodanie unikalnego do istniejącego klucza obcego

Poprawię to jak idę. MySQL spełni Twoje życzenia, a nawet pozwoli Ci strzelić sobie w stopę po drodze:

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;

Więc spójrz na cały bagaż, który musisz nosić ze swoimi upssertami (czytaj:powolne dodatkowe niepotrzebne indeksy).

Więc jeśli chcesz, aby była jak najszczuplejsza, jak wspomniałem w komentarzach, rozwiń najpierw rzeczy, upuszczając FK w tabelach podrzędnych, odwoływanie się pierwszy. Zobacz Tę odpowiedź .

Następnie usuń bieżący nieunikalny klucz nadrzędny:

DROP INDEX index_name ON tbl_name;

Następnie dodaj unikalny klucz w rodzicu. To jest nowy wspomniany :

CREATE UNIQUE INDEX idxName ON tbl_name (colName);

Następnie dodaj FK w dzieciach (odwołanie )

CREATE INDEX idxName ON child_tbl_name (colName);

Możesz uzyskać nazwy kluczy, show create table theTableName lub przez SHOW INDEX . Używaj świeżych nazw dla nowych, to nie ma znaczenia.

Takich jak:

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. Wyświetl poziom izolacji dla zapytania w mysql

  2. Czy można dekrementować zmienną w MySQL?

  3. Problem z wstawieniem skryptu Pythona do bazy danych mysql z silnikiem innondb

  4. ElasticSearch rzeki JDBC MySQL nie usuwa rekordów

  5. Zapytanie SQL zwraca tylko pierwszy wiersz