MySQL'de denedim:
mysql> alter table region drop column country_id;
Ve bunu anladım:
ERROR 1025 (HY000): Error on rename of './product/#sql-14ae_81' to
'./product/region' (errno: 150)
Herhangi bir fikir? Yabancı anahtar şeyler?
MySQL'de denedim:
mysql> alter table region drop column country_id;
Ve bunu anladım:
ERROR 1025 (HY000): Error on rename of './product/#sql-14ae_81' to
'./product/region' (errno: 150)
Herhangi bir fikir? Yabancı anahtar şeyler?
Yanıtlar:
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, dizinin adını göstermelidir, şöyle bir şey:
SÖZLEŞME
region_ibfk_1
YABANCI ANAHTARI (country_id
) REFERANSLARcountry
(id
) SİLME HAKKINDA GÜNCELLEME ÜZERİNE EYLEM YOK EYLEM YOK
Şimdi bir sorun:
tablo bölgesi değiştirme yabancı anahtar değiştirme
region_ibfk_1
;
Ve son olarak bir:
tablo bölgesi bırakma sütununu değiştir country_id;
Ve gitmekte fayda var!
Bu gerçekten yabancı bir anahtar hatası, perror kullanarak öğrenebilirsiniz:
shell$ perror 150
MySQL error code 150: Foreign key constraint is incorrectly formed
Nelerin başarısız olduğu hakkında daha fazla bilgi edinmek SHOW ENGINE INNODB STATUS
için, neyin yanlış olduğuna dair ayrıntılar içeren EN SON YABANCI ANAHTAR HATASI bölümünü arayabilirsiniz .
Sizin durumunuzda, büyük olasılıkla bir şey country_id sütununa başvuruyor olabilir.
Mevcut olmayan bir yabancı anahtarı bırakmaya çalışırken de bu hatayı alabilirsiniz. Bu nedenle, yabancı anahtarları düşürürken, her zaman gerçekten var olduklarından emin olun.
Yabancı anahtar varsa ve bu hatayı almaya devam ediyorsanız aşağıdakileri deneyin:
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';
// Yabancı anahtarı buraya bırakın!
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
Bu benim için her zaman hile yapar :)
Bırakma tablosunda 'FOREIGN KEY' yerine 'KEY' kullanarak değiştirme tablosu sorgusunu çalıştırmanız yeterlidir. Umarım bu sorunu çözmeye yardımcı olur ve yabancı anahtar kısıtlamasını düşürür ve tablo sütunlarını değiştirip tabloyu bırakabilirsiniz.
ALTER TABLE slide_image_sub DROP KEY FK_slide_image_sub;
Buraya DROP KEY
yerine DROP FOREIGN KEY
,
umarım yardımcı olur.
Teşekkürler
Biliyorum, bu eski bir gönderi, ancak 1025 hatası arıyorsanız herkesin favori arama motorunda ilk hit.
Ancak, bu sorunu çözmek için kolay bir "kesmek" vardır:
Komutlarınızı yürütmeden önce, bu komutu kullanarak yabancı anahtar kısıtlamaları kontrolünü devre dışı bırakmanız gerekir:
SET FOREIGN_KEY_CHECKS = 0;
Daha sonra komutlarınızı uygulayabilirsiniz.
İşiniz bittikten sonra, bu komutu kullanarak yabancı anahtar kısıtlamaları kontrolünü tekrar etkinleştirmeyi unutmayın:
SET FOREIGN_KEY_CHECKS = 1;
Çabalarınızda iyi şanslar.
Bir zamanlar benzer sorunlar yaşadım. Tablo A'dan birincil anahtarı sildim, ancak tablo BI'dan yabancı anahtar sütununu silmeye çalıştığımda yukarıdaki aynı hata gösterildi.
Sütun adını kullanarak yabancı anahtarı bırakamaz ve bunu PHPMyAdmin veya MySQL ile atlayamazsınız, özniteliği yeniden adlandırmadan veya silmeden önce yabancı anahtar kısıtlamasını kaldırın.
MySQL veritabanınız için hata dosyasına bir göz atın. Göre Bug # 26305 benim sql size nedenini vermeyin. Bu hata MySQL 4.1 ;-)'den beri var
MySQL Workbench gibi bir istemci kullanıyorsanız, yabancı anahtarın silineceği istenen tabloya sağ tıklayın, ardından yabancı anahtar sekmesini seçin ve dizinleri silin.
Sonra sorguyu şu şekilde çalıştırabilirsiniz:
alter table table_name drop foreign_key_col_name;
Muhtemelen değiştirmeye çalıştığınız birincil anahtara başvuran yabancı anahtarlı başka bir tablo var.
Hangi tablonun hataya neden olduğunu bulmak için çalıştırabilir SHOW ENGINE INNODB
STATUS
ve sonra LATEST FOREIGN KEY ERROR
bölüme bakabilirsiniz.
Kısıtlamanın adını göstermek için TABLO OLUŞTUR kategorilerini kullanın.
Büyük olasılıkla category_ibfk_1 olacak
Önce yabancı anahtarı ve ardından sütunu bırakmak için adı kullanın:
ALTER TABLE categories DROP FOREIGN KEY categories_ibfk_1;
ALTER TABLE categories DROP COLUMN assets_id;
iş
SET FOREIGN_KEY_CHECKS=0;
Operasyondan önce de hile yapabilir.
Yabancı anahtar kısıtlama sorununu tahmin ediyorum. Country_id başka bir tabloda yabancı anahtar olarak kullanılıyor mu?
Ben DB guru değilim ama ben fk kaldırarak, benim alter tablo şeyler yaparak ve sonra fk şeyler yeniden yaparak böyle bir sorunu (burada bir fk kısıtlaması vardı) çözüldü düşünüyorum.
Sonucun ne olduğunu duymak isterim - bazen mysql oldukça şifreli.
Benim durumumda, MySQL çalışma tezgahını kullanıyordum ve sütunlarımdan birini bir tabloya bırakırken aynı sorunla karşılaştım. Yabancı anahtarın adını bulamadım. Sorunu çözmek için aşağıdaki adımları izledim:
Rt. şemanızı tıklayın ve 'şema denetçisi'ni seçin. Bu size çeşitli tablolar, sütunlar, dizinler, vb verir.
'Dizinler' adlı sekmeye gidin ve 'Sütun' adlı sütunun altındaki sütunun adını arayın. Bir kez bulunduğunda bu tablo için tablonun adını 'Tablo' sütun adı altında kontrol edin. İstediğiniz tablonun adıyla eşleşiyorsa, yabancı anahtarın adını 'Ad' sütunundan not edin.
Şimdi sorguyu yürütün: ALTER table tableNamexx DROP KEY foreignKeyName;
Şimdi başarıyla yürütülecek olan drop deyimini yürütebilirsiniz.
MySQL 5.6 ile bu hatayı aldım ama Yabancı anahtarlarla ilgisi yoktu. Bu, küçük bir LAN'da sunucu görevi gören bir Windows 7 Professional makinesindeydi.
Istemci uygulaması bir tablo bazı dış verilerle doldurur sonra kalıcı tablolarla birleştirme sonra "geçici" tablo bırakarak bir sorgu çalıştıran oluşturur bir toplu işlem yapıyordu. Bu toplu işlem yaklaşık 300 kez yapar ve bu özel rutin, birdenbire birkaç yıl boyunca haftada haftalarca çalışıyordu.
Benim durumumda uygulama 4 DDL deyimi kullanarak bir CREATE TABLE ve ardından 3 CREATE INDEX kullanıyordu, yabancı anahtar yok. Ancak, dizinlerden yalnızca 2 tanesi oluşturulur ve gerçek tablo .frm dosyası, hata noktasında yeniden adlandırılır.
Benim çözüm, ayrı CREATE INDEX deyimlerinden kurtulmak ve bunları CREATE TABLE deyimini kullanarak oluşturmaktı. Bu yazı yazarken benim için sorunu çözdü ve bu konuyu bulduğunda başka birinin başını kaşıyor.
averageRatings = FOREACH gruplanmışDerlemeler GENERATE group AS jenerik movieID, AVG (ratings.rating) AS ort.
Yukarıdaki gibi bir komut kullanıyorsanız, grubu küçük harflerle kullanmalısınız. Bu benim sorununuzu çözebilir. En azından PIG betiğinde.