MySQL'de Birincil Anahtarı Kaldır


182

Ben kullanıcı_customers canlı MySQL veritabanındaki izinleri eşleyen aşağıdaki tablo şeması var:

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)

User_customer_id ve allow_id için birincil anahtarları kaldırmak ve id için birincil anahtarı tutmak istiyorum.

Komutu çalıştırdığımda:

alter table user_customer_permission drop primary key;

Aşağıdaki hatayı alıyorum:

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

Bir sütunun birincil anahtarını nasıl bırakabilirim?

Yanıtlar:


286

Dizin olmadan, bir otomatik artış sütununun bakımı çok pahalı olur, bu nedenle MySQLbir otomatik artış sütununun bir dizinin en sol parçası olmasını gerektirir.

Anahtarı düşürmeden önce autoincrement özelliğini kaldırmalısınız:

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

PRIMARY KEYÜç sütunu da kapsayan ve idbenzersiz olduğu garanti edilmeyen bir kompozitiniz olduğunu unutmayın .

Benzersiz olursa, tekrar PRIMARY KEYve AUTO_INCREMENTtekrar yapabilirsiniz:

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

Daha sonra kimlik sütununu auto_increment birincil anahtarı olarak geri yüklemek zorunda kalmaz mıydım? tablo değiştir user_customer_permission birincil anahtar (id) ekle; tablo değiştir user_customer_permission değişiklik kimliği id int (11) auto_increment;
markb

@markb: Birincil anahtarı geri yüklerseniz, geri dönebileceğinizden emin olabilirsiniz AUTO_INCREMENT.
Quassnoi

Bu, otomatik bağlama sütunun PRIMARY KEY öğesinin en sol parçası olması anlamına gelir . ?
Arup Rakshit

1
@ArupRakshit: dev.mysql.com/doc/refman/5.6/en/... kullanmak için AUTO_INCREMENTbir bir InnoDB tablosunda mekanizmayı AUTO_INCREMENTkolon ai_colbir endeksli eşdeğer gerçekleştirmek mümkündür, öyle ki, bir dizinin parçası olarak tanımlanmalıdır SELECT MAX(ai_col)arama maksimum sütun değerini elde etmek için Tipik olarak, bu sütun bazı tablo indekslerinin ilk sütunu haline getirilerek elde edilir.
Quassnoi

PRIMARY'in tanımlanmadığını söylüyor. Bu neden oluyor? Bu yüzden birincil anahtarı belirtmeden kimlik sütununu silmek ve tekrar eklemek zorunda kaldım
mrbengi

121

Tek çizgi:

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

Ayrıca otomatik artışı artırmazsınız ve yan etkileri olabilecek yeniden eklemeniz gerekir.


5
Bu cevabın sadece alan tanımını değiştirme ihtiyacını ortadan kaldırmakla kalmayıp, aynı zamanda tablodaki fk kısıtlamaları ile değişime izin verdiği için tepeye çıkması gerektiğini düşünüyorum - gerçekten bana yardımcı oldu!
tomfumb

Mükemmel ! Benim için birincil anahtarı düşürmek işe yaramadı, ben otomatik artıştan kurtulmak için alanı değiştirsem bile. Ama bu çözüm işe yarıyor!
user2447161

14

Quassnoi'nin doğrudan sorunuza cevap verdiğine inanıyorum. Sadece bir yan not: Belki bu sizin açınızdan biraz garip bir ifadedir, ancak her alanda bir tane olmak üzere üç birincil anahtarınız olduğu izlenimi altında görünüyorsunuz. Olay bu değil. Tanım olarak, yalnızca bir birincil anahtarınız olabilir. Burada sahip olduğunuz üç alanın birleşimi olan birincil anahtardır. Bu nedenle, "birincil anahtarı bir sütuna bırakamazsınız". Birincil anahtarı bırakabilir veya birincil anahtarı bırakamazsınız. Yalnızca bir sütun içeren bir birincil anahtar istiyorsanız, mevcut birincil anahtarı 3 sütuna bırakabilir ve 1 sütunda yeni bir birincil anahtar oluşturabilirsiniz.


11
ALTER TABLE `user_customer_permission` MODIFY `id` INT;
ALTER TABLE `user_customer_permission` DROP PRIMARY KEY;

7

Bileşik birincil anahtarınız varsa bunu yapın. ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (col_name1, col_name2);


5

"Birincil anahtarı geri yüklerseniz, tekrar AUTO_INCREMENT anahtarına dönebilirsiniz"

Kimlik sütununun "PK özelliğinin geri yüklenmesi" ve "otomatik enterrement özelliğinin geri yüklenmesi" nin istenip istenmediği konusunda hiçbir soru olmamalıdır.

Tablonun önceki tanımında otomatik bir artış olduğu göz önüne alındığında, bir ID değeri vermeden bu tabloya eklenen bazı programların olması muhtemeldir (çünkü ID sütunu yine de otomatik arttırmadır).

Bu tür bir programın çalışması, autoincrement özelliğini geri yüklemeyerek kesilir.


3

Önce auto_increment alanını aşağıdaki gibi kaldırmak için sütunu değiştirin: alter table user_customer_permission change column id int;

Ardından, birincil anahtarı bırakın. değiştirme tablosu user_customer_permission drop birincil anahtar;



1

Ben aynı sorun vardı ve benim tablo içinde bazı değerlerin yanında. Birincil Anahtarımı

ALTER TABLEuser_customer_permission DROP PRIMARY KEY , ADD PRIMARY KEY (kimliği)

sorun sunucumda devam etti. Tabloda yeni bir alan oluşturdum Değerleri yeni alana aktardım ve eskisini sildim, problem çözüldü !!


1

To eklemek sütununda birincil anahtar.

ALTER TABLE table_name ADD PRIMARY KEY (column_name);

To kaldırmak tablodan birincil anahtar.

ALTER TABLE table_name DROP PRIMARY KEY;

0

Önce veritabanını yedekleyin. Sonra tablo ile ilişkili herhangi bir yabancı anahtarı bırakın. yabancı anahtar tablosunu kısalt. Geçerli tabloyu kısalt. Gerekli birincil anahtarları kaldırın. Sqlyog veya tezgah veya heidisql veya dbeaver veya phpmyadmin kullanın.


0

SQL yöneticisinde tabloyu sağ tıklayın ve tasarımı seçin, ardından küçük anahtar simgesini sağ tıklayın ve birincil anahtarı kaldır'ı seçin.


Bu yazı soruyu çözebilir, ancak bir ekran görüntüsü dahil olmak, yayınınızın kalitesini artırmaya yardımcı olur. Gelecekte okuyucular için soruyu cevapladığınızı ve bu kişilerin baktığınız kullanıcı arayüzünü bilmeyebileceğini unutmayın.
Pirate X
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.