2012-11-28 24 views
51

Bu hatayı, tablomu değiştirmeye çalışırken aldım.Yabancı anahtar kısıtlaması kullanılan sütun değiştirilemiyor

Error Code: 1833. Cannot change column 'person_id': used in a foreign key constraint 'fk_fav_food_person_id' of table 'table.favorite_food' 

İşte benim CREATE TABLE STATEMENT'im başarıyla çalıştı.

CREATE TABLE favorite_food(
    person_id SMALLINT UNSIGNED, 
    food VARCHAR(20), 
    CONSTRAINT pk_favorite_food PRIMARY KEY(person_id,food), 
    CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id) 
    REFERENCES person (person_id) 
); 

Daha sonra bu ifadeyi çalıştırmayı denedim ve yukarıdaki hatayı aldım.

ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT; 

cevap

52

Yabancı anahtar alanı ve referans türü ve tanımı eşit olmalıdır. Bu, yabancı anahtarınızın alanınızın türünü değiştirmeye izin vermediği anlamına gelir.

bir çözüm bu olacaktır:

Eğer

ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT; 

yabancı anahtar

ALTER TABLE favorite_food 
    ADD CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id) 
      REFERENCES person (person_id); 

UNLOCK TABLES; 

DÜZENLEMEYİ yeniden person_id değiştirebilir Şimdi

LOCK TABLES favorite_food WRITE, person WRITE; ALTER TABLE favorite_food DROP FOREIGN KEY fk_fav_food_person_id, MODIFY person_id SMALLINT UNSIGNED; 

: Yukarıdaki Eklenen kilitleri, teşekkürler Yorumlara

Bunu yaparken veritabanına yazma işlemine izin vermemelisiniz, aksi halde veri bütünlüğü sorunlarına neden olabilirsiniz.

ben ekledim

dışında herhangi bir oturumda tüm yazılı sorguları üzerinde bir yazma kilidi kendi (INSERT, UPDATE, DELETE) zaman aşımı veya UNLOCK TABLES kadar bekler; . DÜZENLEME 2

http://dev.mysql.com/doc/refman/5.5/en/lock-tables.html

yürütülür: OP hattı "tipi ve yabancı anahtar alanı ve eşit olmalıdır referans tanımının daha ayrıntılı bir açıklama istedi Bu yabancı anahtar olanak vermez tipini değiştirerek anlamı senin alan." Onlar bir tür dönüştürme olmadan karşılaştırıldığında olabilir, böylece yabancı anahtar ve başvurulan anahtar şıra yılında

MySQL 5.5 Reference Manual: FOREIGN KEY Constraints itibaren Sorumlu sütunlar InnoDb içindeki benzer dahili veri türleri vardır. Tamsayı türleri 'un boyutu ve işareti aynı olmalıdır. Dize türlerinin uzunluğu aynı olmamalıdır. dizgi (karakter) dizgi sütunları için karakter kümesi ve harmanlama aynı olmalıdır.

SET FOREIGN_KEY_CHECKS = 0; 

/* DO WHAT YOU NEED HERE */ 

SET FOREIGN_KEY_CHECKS = 1; 

üretimine bu KULLANMAYIN emin olun ve bir yedek var:

+1

Bunun için bir işlem kullanmayı unutmayın. Aksi halde veritabanınız bozulabilir. –

+2

İyi nokta, ne yazık ki MySQL, DDL ifadeleri etrafındaki işlemleri desteklemiyor. Açık işlemler bir DDL sorgusu yürütülmeden önce yapılır. Bkz. Http://dev.mysql.com/doc/refman/5.5/en/implicit-commit.html –

+0

@FrancoisBourgeois: Bana bu satırda daha fazla bilgi verir misiniz? yabancı anahtar alan ve referans tanımı – theJava

0

Eğer dönüş sınırlar içinde onlarla ne yapabilirim onlar nasıl kullanılabileceği üzerinde size kısıtlamalar ayarlarken (birincil ya da yabancı) tuşları, ayarladığınızda. Sütunu gerçekten değiştirmek isterseniz, tabloyu kısıtlama olmadan yeniden oluşturabilirsiniz. Genel olarak, eğer bir şey yapmak istediğiniz bir durumunuz varsa, ancak bir kısıtlama tarafından engellendiyse, en iyi, kısıtlamadan ziyade yapmak istediğiniz şeyi değiştirerek çözülür.

+1

Bu, * SUCH * yararsızdır, yararsızdır! – ajmedway

+1

@ajmedway O zaman diğer kullanıcıları suçlamadan yardımcı bir cevap yazabilirsiniz –

91

Sen yabancı anahtar kontrolleri kapatabilirsiniz.

+2

. Teşekkürler. – redDevil

+0

Çok güvensiz bir çözüm gibi görünüyor. Potansiyel veri bütünlüğü kaybına yol açabilir mi? – hrust

+0

@Synaps - evet, silme/güncelleme/ekleme yapıyor olabilirsiniz. Sadece bir tabloyu değiştirirseniz veya db'nizi ekliyorsanız veri kaybı oluşmaz, öte yandan verilerinizi manuel olarak doğrulamanız gerekir (kısıtlamaları kaldırdığınızdan) – Dementic

İlgili konular