Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

menambahkan unik ke kunci asing yang ada

Saya akan meningkatkan ini saat saya pergi. MySQL akan memenuhi keinginan Anda, bahkan memungkinkan Anda untuk menembak diri sendiri saat Anda berjalan:

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;

Jadi lihat semua bagasi yang harus Anda bawa dengan upsert Anda (baca:indeks ekstra yang tidak perlu lambat).

Jadi jika Anda menginginkannya se-ramping mungkin, seperti yang saya sebutkan di komentar, lepaskan dulu dengan meletakkan FK di tabel anak, referensi pertama. Lihat Jawaban Ini .

Kemudian lepaskan kunci induk non-unik saat ini:

DROP INDEX index_name ON tbl_name;

Kemudian tambahkan kunci unik di induknya. Ini adalah referensi baru :

CREATE UNIQUE INDEX idxName ON tbl_name (colName);

Kemudian tambahkan FK pada anak-anak (referensi )

CREATE INDEX idxName ON child_tbl_name (colName);

Anda bisa mendapatkan nama kunci dengan show create table theTableName atau dengan SHOW INDEX . Gunakan nama baru untuk yang baru, tidak masalah.

Seperti:

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. Kesalahan fatal:Tidak dapat menggunakan objek bertipe stdClass sebagai array di

  2. Ekspresi mysql SEKARANG () di Doctrine QueryBuilder

  3. Saya ingin mengambil hasil dari connection.query mysql dan menyimpannya dalam rantai lingkup global di nodejs

  4. Memahami struktur catatan MyISAM

  5. Bagaimana cara mendapatkan nama kolom skema di sqlsoup dengan python?