Hapus Primary Key di MySQL

182

Saya memiliki skema tabel berikut yang memetakan user_customers untuk izin pada database MySQL langsung:

mysql> describe user_customer_permission;
+------------------+---------+------+-----+---------+----------------+
| Field            | Type    | Null | Key | Default | Extra          |
+------------------+---------+------+-----+---------+----------------+
| id               | int(11) | NO   | PRI | NULL    | auto_increment |
| user_customer_id | int(11) | NO   | PRI | NULL    |                |
| permission_id    | int(11) | NO   | PRI | NULL    |                |
+------------------+---------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

Saya ingin menghapus kunci utama untuk user_customer_id dan permit_id dan mempertahankan kunci utama untuk id.

Ketika saya menjalankan perintah:

alter table user_customer_permission drop primary key;

Saya mendapatkan kesalahan berikut:

ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

Bagaimana saya bisa menjatuhkan kunci utama kolom?

markb
sumber

Jawaban:

286

Tanpa indeks, mempertahankan kolom peningkatan otomatis menjadi terlalu mahal, itu sebabnya MySQLmengharuskan kolom peningkatan otomatis menjadi bagian paling kiri dari indeks.

Anda harus menghapus properti autoincrement sebelum menjatuhkan kunci:

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL;
ALTER TABLE user_customer_permission DROP PRIMARY KEY;

Perhatikan bahwa Anda memiliki komposit PRIMARY KEYyang mencakup ketiga kolom dan idtidak dijamin unik.

Jika kebetulan unik, Anda bisa membuatnya menjadi PRIMARY KEYdan AUTO_INCREMENTlagi:

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL PRIMARY KEY AUTO_INCREMENT;
Quassnoi
sumber
Bukankah saya kemudian harus mengembalikan kolom id sebagai kunci utama auto_increment? ubah tabel user_customer_permission tambahkan kunci utama (id); ubah tabel user_customer_permission ubah id id int (11) auto_increment;
Markb
@markb: jika Anda mengembalikan kunci utama, Anda yakin dapat mengembalikannya ke AUTO_INCREMENT.
Quassnoi
apa artinya kolom peningkatan otomatis ini menjadi bagian paling kiri dari PRIMARY KEY. ?
Arup Rakshit
1
@ArupRakshit: dev.mysql.com/doc/refman/5.6/en/... Untuk menggunakan AUTO_INCREMENTmekanisme dengan tabel InnoDB, AUTO_INCREMENTkolom ai_colharus didefinisikan sebagai bagian dari indeks sehingga memungkinkan untuk melakukan setara dengan SELECT MAX(ai_col)pencarian yang diindeks. di atas meja untuk mendapatkan nilai kolom maksimum. Biasanya, ini dicapai dengan membuat kolom kolom pertama dari beberapa indeks tabel.
Quassnoi
katanya PRIMARY tidak didefinisikan. Kenapa ini terjadi? Jadi saya harus menghapus dan menambahkan lagi kolom ID tanpa menentukan kunci primer
mrbengi
121

Satu baris:

ALTER TABLE  `user_customer_permission` DROP PRIMARY KEY , ADD PRIMARY KEY (  `id` )

Anda juga tidak akan kehilangan peningkatan otomatis dan harus menambahkannya kembali yang dapat memiliki efek samping.

mluebke
sumber
5
Saya pikir jawaban ini perlu mengapung ke atas karena tidak hanya menghilangkan kebutuhan untuk mengubah definisi bidang, tetapi juga memungkinkan perubahan melalui dengan batasan fk pada tabel yang sedang diubah - benar-benar membantu saya keluar!
Tomfumb
Sempurna! Bagi saya menjatuhkan kunci utama tidak berfungsi, bahkan jika saya mengubah bidang untuk menyingkirkan kenaikan otomatis. Tetapi solusi ini berfungsi dengan baik!
user2447161
14

Saya yakin Quassnoi telah menjawab pertanyaan langsung Anda. Hanya catatan tambahan: Mungkin ini hanya kata-kata canggung di pihak Anda, tetapi Anda tampaknya mendapat kesan bahwa Anda memiliki tiga kunci utama, satu di setiap bidang. Ini bukan kasusnya. Menurut definisi, Anda hanya dapat memiliki satu kunci utama. Apa yang Anda miliki di sini adalah kunci utama yang merupakan gabungan dari tiga bidang. Dengan demikian, Anda tidak dapat "menjatuhkan kunci utama pada kolom". Anda dapat menjatuhkan kunci utama, atau tidak menjatuhkan kunci utama. Jika Anda menginginkan kunci utama yang hanya mencakup satu kolom, Anda dapat menjatuhkan kunci primer yang ada di 3 kolom dan membuat kunci primer baru pada 1 kolom.

Jay
sumber
11
ALTER TABLE `user_customer_permission` MODIFY `id` INT;
ALTER TABLE `user_customer_permission` DROP PRIMARY KEY;
Alix Axel
sumber
7

Jika Anda memiliki kunci primer komposit, lakukan seperti ini- ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (col_name1, col_name2);

Visvendra Singh Rajpoot
sumber
5

"jika Anda mengembalikan kunci utama, Anda pasti dapat mengembalikannya kembali ke AUTO_INCREMENT"

Seharusnya tidak ada pertanyaan apakah diinginkan untuk "mengembalikan properti PK" dan "mengembalikan properti autoincrement" pada kolom ID.

Mengingat bahwa itu adalah peningkatan otomatis dalam definisi tabel sebelumnya, sangat mungkin bahwa ada beberapa program yang memasukkan ke dalam tabel ini tanpa memberikan nilai ID (karena kolom ID bagaimanapun juga adalah peningkatan otomatis).

Setiap operasi program semacam itu akan rusak dengan tidak mengembalikan properti autoincrement.

Erwin Smout
sumber
3

Pertama-tama, modifikasi kolom untuk menghapus bidang auto_increment seperti ini: ubah tabel user_customer_permission ubah kolom id int;

Selanjutnya, lepaskan kunci utama. ubah tabel user_customer_permission drop primary key;

John Gunderman
sumber
2
ALTER TABLE `table_name` ADD PRIMARY KEY( `column_name`);
Malith Ileperuma
sumber
1

Saya memiliki masalah yang sama dan di samping beberapa nilai di dalam meja saya. Meskipun saya mengubah Kunci Utama saya dengan

ALTER TABLEDROP PRIMARY KEY , ADD PRIMARY KEY (id user_customer_permission)

masalah berlanjut di server saya. Saya membuat bidang baru di dalam tabel. Saya mentransfer nilai ke bidang baru dan menghapus yang lama, masalah terpecahkan !!

Sam
sumber
1

Untuk menambahkan kunci utama di kolom.

ALTER TABLE table_name ADD PRIMARY KEY (column_name);

Untuk menghapus kunci utama dari tabel.

ALTER TABLE table_name DROP PRIMARY KEY;
sumit katiyar
sumber
0

Pertama-tama buat cadangan database. Lalu jatuhkan kunci asing apa pun yang terkait dengan tabel. memotong tabel kunci asing. Memotong tabel saat ini. Hapus kunci utama yang diperlukan. Gunakan sqlyog atau workbench atau heidisql atau dbeaver atau phpmyadmin.

Noby Nirmal
sumber
0

Temukan tabel di SQL manager klik kanan dan pilih desain, lalu klik kanan ikon kunci kecil dan pilih hapus kunci utama.

Penolong Noob
sumber
Meskipun posting ini dapat menyelesaikan pertanyaan, termasuk tangkapan layar benar-benar membantu meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, dan orang-orang itu mungkin tidak tahu UI yang sama dengan yang Anda lihat.
Bajak Laut X