Saya punya meja yang disebut provider
. Saya memiliki tiga kolom disebut person
, place
, thing
. Mungkin ada orang duplikat, tempat duplikat, dan barang-barang duplikat, tetapi tidak akan pernah ada kombinasi orang-tempat-benda duplikat.
Bagaimana saya ALTER TABLE untuk menambahkan kunci primer komposit untuk tabel ini di MySQL dengan tiga kolom ini?
@Adrian Cornish jawabannya benar. Namun, ada peringatan lain untuk menjatuhkan kunci primer yang ada. Jika kunci utama itu digunakan sebagai kunci asing oleh tabel lain, Anda akan mendapatkan kesalahan saat mencoba menjatuhkannya. Di beberapa versi mysql pesan kesalahan ada yang salah (per 5.5.17, pesan kesalahan ini masih
Jika Anda ingin menjatuhkan kunci utama yang direferensikan oleh tabel lain, Anda harus menjatuhkan kunci asing di tabel lain terlebih dahulu. Anda dapat membuat ulang kunci asing itu jika Anda masih menginginkannya setelah Anda membuat ulang kunci utama.
Juga, ketika menggunakan kunci komposit, urutan penting. Ini
bukan hal yang sama. Mereka berdua menegakkan keunikan pada set tiga bidang, namun dari sudut pandang pengindeksan ada perbedaan. Kolom diindeks dari kiri ke kanan. Misalnya, pertimbangkan pertanyaan berikut:
B dapat menggunakan indeks kunci utama dalam pernyataan ALTER 1
A dapat menggunakan indeks kunci utama dalam pernyataan ALTER 2
C dapat menggunakan indeks
D tidak dapat menggunakan indeks baik
A menggunakan dua bidang pertama dalam indeks 2 sebagai indeks parsial. A tidak dapat menggunakan indeks 1 karena tidak tahu bagian tempat menengah dari indeks. Mungkin masih bisa menggunakan indeks parsial pada orang biasa saja.
D tidak dapat menggunakan indeks mana pun karena tidak mengenal orang.
Lihat dokumen mysql di sini untuk informasi lebih lanjut.
sumber
Anda mungkin hanya menginginkan KONSTRA UNIK. Apalagi jika Anda sudah memiliki kunci pengganti. (contoh kunci pengganti yang sudah ada akan menjadi satu kolom yang merupakan AUTO_INCREMENT)
Di bawah ini adalah kode sql untuk Batasan Unik
sumber
sumber
Pasti lebih baik menggunakan COMPOSITE UNIQUE KEY, seperti yang ditawarkan @GranadaCoder, contoh yang sedikit rumit:
ALTER IGNORE TABLE table_name ADD UNIQUES INDEX idx_name(some_id, another_id, one_more_id);
sumber
ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (col_name1, col_name2);
sumber