Mysql error 1025 (HY000) ne anlama geliyor: './foo' (hata no: 150) yeniden adlandırılırken hata oluştu?


160

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?


@skiphoppy - Zaten verilen cevaba bir ödül vermeye mi çalışıyorsun? Buna bile izin var mı? Veya durumunuz farklı mı, bu durumda başka bir konu başlatmalısınız?
Rick James

@RickJames Evet öyle. Ancak, skiphoppy yorumunu seçtiği cevabın altına eklemelidir, çünkü ödül süresi sona erdiğinde nöbetçi mesajı kaybolacaktır.
RandomSeed

Yanıtlar:


240

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_1YABANCI ANAHTARI ( country_id) REFERANSLAR country( 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!


Yabancı anahtarı ve sütunu bir ALTER TABLE sorgusuna da bırakabileceğinizi unutmayın;
Valentin Grégoire

Güzel! yabancı anahtar bırakmalıyız, her şey iyi olacak! Teşekkürler!
Luan D

173

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 STATUSiç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.


2
Yine, başka bir yanıltıcı MySQL hata gösterdi ... Teşekkürler.
e2-e4

PhpMyAdmin'de, motorun durumunu Depolama Motorları , InnoDB , InnoDB Durumu'nda bulabilirsiniz
Maxence

15

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 :)


1
Bir mysql hatası nedeniyle bir tablonun farklı bir karakter kümesine geçerken buna ihtiyacım vardı: ERROR 1025 (HY000): './table/#sql-14ae_81' adını (errno: 150) yeniden adlandırma hatası
letsjump

7

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 KEYyerine DROP FOREIGN KEY,

umarım yardımcı olur.

Teşekkürler


4

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.


Xampp üzerinde octobercms yükleme konusunda sorun yaşıyordu, nihayet bu yardımcı oldu.
jahackbeth

2

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.


1

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


Cevabınızın bazılarını takip etmeyi zor buldum, ancak bir hata raporuna bağladığınız için +1. Görünüşe göre, şimdi MySQL v5.6.6'da düzeltildi. :)
mwfearnley

1

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;

1

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 STATUSve sonra LATEST FOREIGN KEY ERRORbö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;


0

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.


Mysql korkunç olabilir. Genellikle iyi, ama bu hata mesajları, şeyh. Ofisteki birinden kısa bir açıklama alırsak, buraya atarım.
Trenton

0

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:

  1. Rt. şemanızı tıklayın ve 'şema denetçisi'ni seçin. Bu size çeşitli tablolar, sütunlar, dizinler, vb verir.

  2. '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.

  3. Şimdi sorguyu yürütün: ALTER table tableNamexx DROP KEY foreignKeyName;

  4. Şimdi başarıyla yürütülecek olan drop deyimini yürütebilirsiniz.


0

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.


-2

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.


Bunun sorunla ilgili olduğunu düşünmüyorum, o mysql sorununa çarpıyor
Zdenek Machek
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.