MySQL Bazı Yabancı Anahtarları Kaldırma


190

Birincil anahtarı diğer bazı tablolarda kullanılan ve diğer tablolara birkaç yabancı anahtarları olan bir tablo var.

CREATE TABLE location (
   locationID INT NOT NULL AUTO_INCREMENT PRIMARY KEY
   ...
) ENGINE = InnoDB;

CREATE TABLE assignment (
   assignmentID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   locationID INT NOT NULL,
   FOREIGN KEY locationIDX (locationID) REFERENCES location (locationID)
   ...
) ENGINE = InnoDB;

CREATE TABLE assignmentStuff (
   ...
   assignmentID INT NOT NULL,
   FOREIGN KEY assignmentIDX (assignmentID) REFERENCES assignment (assignmentID)
) ENGINE = InnoDB;

Sorun, yabancı anahtar sütunlarından birini (yani locationIDX) bırakmaya çalıştığımda bana bir hata veriyor olmasıdır.

"ERROR 1025 (HY000): Yeniden adlandırma hatası"

Bu hatayı almadan sütunu yukarıdaki atama tablosuna nasıl bırakabilirim?

Yanıtlar:


447

As açıkladı Burada , yabancı anahtar kısıtlaması tarafından kesilmesini sahip görünüyor kısıtlama adı değil dizin adı. Sözdizimi:

alter table footable drop foreign key fooconstraint

35
Bu benim sorunumdu. Şimdi kendimi aptal gibi hissediyorum. Başka biri bu sorunla karşılaşırsa, SHOW CREATE TABLE işlevini kullanarak Yabancı Anahtar Kısıtlama adlarını bulabilirsiniz.
Drew

14
İpucu: SHOW CREATE TABLE footable;kısıtlamanın adının ne olduğunu görmek için kullanın . Tek başına sütunun adı değil. Cevap için teşekkürler!
Chris Baker

2
Yabancı anahtar kısıtlamaları bulmak için bunu kullanabilirsiniz: SELECT * FROM information_schema.table_constraints WHERE constraint_schema = '<db adınız>' AND constraint_type = 'FOREIGN KEY'
Gayan Dasanayake 26:17

21

Yabancı anahtarlar veri bütünlüğünü sağlamak için vardır, bu nedenle yabancı anahtarın bir parçası olduğu sürece bir sütunu bırakamazsınız. Önce anahtarı bırakmanız gerekir.

Aşağıdaki sorgu yapardı düşünürdüm:

ALTER TABLE assignmentStuff DROP FOREIGN KEY assignmentIDX;

16

Yukarıda herkesin söylediği gibi, bir FK'yi kolayca silebilirsiniz. Ancak, sadece bir noktada ANAHTAR'ın kendisini bırakmanın gerekli olabileceğini fark ettim. Sonuncusu gibi başka bir dizin oluşturmak için herhangi bir hata mesajınız varsa, yani aynı adla, bu dizinle ilgili her şeyi bırakmak yararlı olacaktır.

ALTER TABLE your_table_with_fk
  drop FOREIGN KEY name_of_your_fk_from_show_create_table_command_result,
  drop KEY the_same_name_as_above

10

CONSTRAINT adının ve FOREIGN KEY adının ne olduğunu kontrol edin:

SHOW CREATE TABLE table_name;

Hem CONSTRAINT adını hem de FOREIGN KEY adını kaldırın:

ALTER TABLE table_name
  DROP FOREIGN KEY the_name_after_CONSTRAINT,
  DROP KEY the_name_after_FOREIGN_KEY;

Bu yardımcı olur umarım!


4

İşte yabancı anahtar kısıtlamasını düşürmenin bir yolu, işe yarayacak. ALTER TABLOSU location. location_id YABANCI ANAHTARI DÜŞÜN location_ibfk_1;


2

Hey, yukarıdaki bir diziyi takip ettim ve bir çözüm buldum.

SHOW CREATE TABLE footable;

FK Constrain Name gibi alacaksınız

ProjectsInfo_ibfk_1

Şimdi bu kısıtlamaları kaldırmanız gerekiyor. tarafından alter table commantd

alter table ProjectsInfo drop foreign key ProjectsInfo_ibfk_1;

Sonra tablo sütununu bırakın,

alter table ProjectsInfo drop column clientId;

1

Tablolarınız InnoDB motorunu kullanıyorsa genellikle bu hatayı alırsınız. Bu durumda, yabancı anahtarı bırakmanız ve daha sonra tabloyu değiştirip sütunu bırakmanız gerekir.

Ancak zor kısım, yabancı anahtarı sütun adını kullanarak bırakamamanızdır, ancak bunun yerine dizine eklemek için kullanılan adı bulmanız gerekir. Bunu bulmak için aşağıdakileri seçin:

MASA OLUŞTURMA tablosu bölgesi; Bu size bir satır göstermelidir, sol üst köşede + seçeneğine tıklayın, tam metin raio düğmesine tıklayın ve ardından git'e tıklayın. İndeksin adını alacaksınız, şöyle bir şey:

CONSTRAINT region_ibfk_1 YABANCI ANAHTAR (country_id) REFERANSLAR ülke (id) SİLME GÜNCELLEME ÜZERİNDE EYLEM YOK EYLEM YOK Şimdi sadece bir sorun çıkar:

tablo bölgesi değiştirme yabancı anahtar bölge_ibfk_1;

veya

daha basitçe şunu yazın: - tabloyu değiştir TableName drop yabancı anahtar TableName_ibfk_1 ;

Unutmayın tek şey, böyle yapmak için tablename sonra _ibfk_1 eklemek için: - TableName _ibfk_1


0

Tablodan başvurulduğu için yabancı anahtar sütununu bırakamazsınız assignmentStuff. Bu yüzden önce yabancı anahtar kısıtlamasını bırakmalısınız assignmentStuff.assignmentIDX.

Benzer bir soru burada zaten sorulmuştur . Daha fazla bilgi için de buraya bakın.


1
Bu nedenle, assignmentStuff atamanın birincil anahtarına başvurduğundan, atamanın locationID sütununu bırakamıyorum? Bu bir tür sezgisel gibi görünüyor.
Drew

Bazı sütun adlarını değiştirdim, bu yüzden cevabım gerçekten mantıklı değil. Bunun için üzgünüm ...
Ronald Wildenberg


0

Aşama 1: show create table vendor_locations;

Adım 2: ALTER TABLE vendor_locations drop foreign key vendor_locations_ibfk_1;

benim için çalıştı.


0

ilk önce bu sorgu ile gerçek kısıtlama adı almanız gerekir

SHOW CREATE TABLE TABLE_NAME

Bu sorgu yabancı anahtarın kısıtlama adı ile sonuçlanacaktır, şimdi aşağıdaki sorgu onu bırakacaktır.

ALTER TABLE TABLE_NAME DROP FOREIGN KEY COLUMN_NAME_ibfk_1

yukarıdaki kısıtlama adındaki son sayı, tabloda kaç tane yabancı anahtarınızın bulunduğuna bağlıdır

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.