Hata Kodu: 1005. '…' tablosu oluşturulamıyor (hata no: 150)


103

İnternette bu soruna bir çözüm aradım ve Stack Overflow sorularını kontrol ettim, ancak çözümlerden hiçbiri benim durumum için işe yaramadı.

Table sira_no'dan metal_kod'a bir yabancı anahtar oluşturmak istiyorum.

ALTER TABLE sira_no
    ADD CONSTRAINT METAL_KODU FOREIGN KEY(METAL_KODU)
    REFERENCES metal_kod(METAL_KODU)
    ON DELETE SET NULL
    ON UPDATE SET NULL ;

Bu komut dosyası şunu döndürür:

Error Code: 1005. Can't create table 'ebs.#sql-f48_1a3' (errno: 150)

Başvurulan tabloya bir dizin eklemeyi denedim:

CREATE INDEX METAL_KODU_INDEX ON metal_kod (METAL_KODU);

METAL_KODU’yu her iki tabloda da (karakter kümesi ve harmanlama) kontrol ettim, ancak bu soruna bir çözüm bulamadım. Bu sorunu nasıl çözebilirim?

İşte metal_kod tablosu:

METAL_KODU    varchar(4)    NO    PRI
DURUM    bit(1)    NO
METAL_ISMI    varchar(30)    NO
AYAR_YOGUNLUK    smallint(6)    YES        100

metal_kodTablonun şemasını gösterebilir misiniz ... bu tablodaki hangi alanda Yabancı Anahtar başvurmalıdır ?
Manse

Yanıtlar:


271

Hata Kodu: 1005 - kodunuzda yanlış bir birincil anahtar referansı var

Genellikle var olmayan bir referans yabancı anahtar alanından kaynaklanır. Bir yazım hatası yapmış olabilirsiniz veya aynı olması gerektiğini kontrol edin veya alan tipi uyuşmazlığı olabilir. Yabancı anahtar bağlantılı alanlar tanımlarla tam olarak eşleşmelidir.

Bilinen bazı nedenler şunlar olabilir:

  1. İki anahtar alan türü ve / veya boyutu tam olarak eşleşmiyor. Örneğin INT(10), anahtar alan biri ise ya da INT(10)değil de olmalı . Alan boyutunu kullanarak onaylamak isteyebilirsiniz çünkü Sorgu Tarayıcısı bazen görsel olarak yalnızca her ikisi için ve . Ayrıca birinin olmadığını ve diğerinin olduğunu da kontrol etmelisiniz . İkisinin de tamamen aynı olması gerekiyor.INT(11)TINYINTSHOW CREATE TABLEINTEGERINT(10)INT(11)SIGNEDUNSIGNED
  2. Başvurmaya çalıştığınız anahtar alanlardan birinin dizini yok ve / veya birincil anahtar değil. İlişkideki alanlardan biri birincil anahtar değilse, bu alan için bir dizin oluşturmanız gerekir.
  3. Yabancı anahtar adı, zaten var olan bir anahtarın kopyasıdır. Yabancı anahtarınızın adının veritabanınızda benzersiz olup olmadığını kontrol edin. Bunu test etmek için anahtar adınızın sonuna rastgele birkaç karakter eklemeniz yeterlidir.
  4. Masalarınızdan biri veya her ikisi de bir MyISAMmasadır. Yabancı anahtarları kullanmak için tabloların her ikisi de olmalıdır InnoDB. (Aslında, her iki tablo da MyISAMöyleyse, bir hata mesajı almazsınız - yalnızca anahtarı oluşturmaz.) Sorgu Tarayıcısında, tablo türünü belirtebilirsiniz.
  5. Bir basamaklama belirlediniz ON DELETE SET NULL, ancak ilgili anahtar alanı olarak ayarlandı NOT NULL. Bunu, kademenizi değiştirerek veya alanı NULLdeğerlere izin verecek şekilde ayarlayarak düzeltebilirsiniz .
  6. Karakter Kümesi ve Harmanla seçeneklerinin hem tablo düzeyinde hem de anahtar sütunlar için ayrı alan düzeyinde aynı olduğundan emin olun.
  7. Yabancı anahtar sütununuzda varsayılan bir değeriniz var (yani varsayılan = 0)
  8. İlişkideki alanlardan biri bir kombinasyon (bileşik) anahtarın parçasıdır ve kendi bireysel dizini yoktur. Alan, bileşik anahtarın parçası olarak bir dizine sahip olsa da, onu bir kısıtlamada kullanmak için yalnızca bu anahtar alanı için ayrı bir dizin oluşturmanız gerekir.
  9. ALTERİfadenizde bir sözdizimi hatası var veya ilişkideki alan adlarından birini yanlış yazdınız
  10. Yabancı anahtarınızın adı maksimum 64 karakter uzunluğunu aşıyor.

Daha fazla ayrıntı için, bakınız: MySQL Hata Numarası 1005 Tablo oluşturulamıyor


4
sorun yabancı anahtar karakter kümelerinin eşleşmemesiydi. Cevap için teşekkürler.
lamostreta

4
SHOW ENGINE INNODB STATUSbu soruda belirtildiği gibi, özel sorunumu teşhis etmeme yardımcı oldu (PEBCAK, benim durumumda ...)
Hobo

1
lanet olsun, o bile birincil anahtar. Bu anahtar için ayrı bir dizin oluşturmanız gerekir. teşekkürler bu sorunumu çözdü.
RSB

3
# 4 benim sorunumdu - tablolardan biri MyISAM'dı ve komut dosyası bir InnoDB tablosu oluşturmaya çalıştı. Başlangıçta MySQL 5.0 veya benzeri bir sürümü çalıştıran, varsayılan depolama motorunun MyISAM olduğu ve komut dosyalarının düzgün çalıştığı eski bir sistemi dağıtmaya çalışırken bu sorunla karşılaştım. Mevcut ortamım 5.5 ve varsayılan depolama InnoDB'dir. set names 'utf8', storage_engine=MYISAM;Senaryonun başına eklemek sorunu benim için çözdü. Ayrıntılı cevap için @ user319198 ve @Stefano'ya teşekkür ederiz! : o)
Boris Chervenkov

1
Benimkinde # 1'de belirtildiği gibi 'imzasız' özelliği eksikti, teşekkürler!
helvete

11

Bu, veritabanınızı bir sunucudan diğerine aktarırken de olabilir ve tablolar varsayılan olarak alfabetik sırayla listelenir.
Bu nedenle, ilk tablonuz henüz oluşturulmamış başka bir tablonun yabancı anahtarına sahip olabilir. Bu gibi durumlarda, foreign_key_checks'i devre dışı bırakın ve veritabanını oluşturun.

Aşağıdakileri komut dosyanıza eklemeniz yeterlidir:

SET FOREIGN_KEY_CHECKS=0;

ve işe yarayacak.


4

Çoğu zaman, yabancı anahtar ve referans anahtar aynı türe veya aynı uzunluğa sahip olmadığında olur.


4

Bazen bunun nedeni ana tablonun kaldırılmasıdır (belki de foreign_key_checks'i devre dışı bırakarak), ancak CONSTRAINT yabancı anahtar hala diğer tablolarda mevcuttur. İçinde my durumda Masayı düştü ve yeniden çalıştı, ama benim için aynı hatayı atma almıştı.

Bu nedenle, varsa tüm yabancı anahtar CONSTRAINT'lerini tüm tablolardan kaldırmayı deneyin ve ardından tabloyu güncelleyin veya oluşturun.


2

Benzer bir hatam vardı. Sorun, alt ve üst tablonun aynı karakter grubuna ve harmanlamaya sahip olmamasıyla ilgiliydi. Bu, ENGINE = InnoDB VARSAYILAN KARAKTER SET = utf8 eklenerek düzeltilebilir;

CREATE TABLE IF NOT EXISTS `country` (`id` INT(11) NOT NULL AUTO_INCREMENT,...) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;

... SQL deyiminde, bazı eksik kodlar olduğu anlamına gelir.


2

Yabancı anahtarın başvurduğu birincil anahtarla tam olarak aynı türe sahip olması gerekir. Örneğin "INT UNSIGNED NOT NULL" türünde olduğu için, öndeki anahtarın da "INT UNSIGNED NOT NULL" olması gerekir

CREATE TABLE employees(
id_empl INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id)
);
CREATE TABLE offices(
id_office INT UNSIGNED NOT NULL AUTO_INCREMENT,
id_empl INT UNSIGNED NOT NULL,
PRIMARY KEY(id),
CONSTRAINT `constraint1` FOREIGN KEY (`id_empl`) REFERENCES `employees` (`id_empl`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='my offices';

imzasız benim için sorun oldu. Teşekkürler!
Gabo

2

Hata Kodu: 1005

Benzer bir sorun yaşadım, işte denediğim birkaç şey var (çözüm dışında herhangi bir sırayla değil :))

  1. Yabancı anahtar adlarını değiştirdi (işe yaramadı)
  2. Yabancı anahtar uzunluğu azaltıldı
  3. Veri türlerini doğruladı (yanlış bir şey yapmayın)
  4. Dizinleri kontrol edin
  5. Harmanlamaları kontrol edin (her şey yolunda, tekrar daraltın)
  6. İşe yaramayan masayı kısalttı
  7. Tabloyu düşürdüm ve yeniden oluşturdu
  8. Herhangi bir döngüsel referans oluşturulup oluşturulmadığını görmeye çalıştım - hepsi iyi
  9. Sonunda iki editörümün açıldığını gördüm. PhpStorm'da (JetBrains) ve diğer MySQL çalışma tezgahında. Görünüşe göre PhpStorm / MySQL Workbench bir tür düzenleme kilidi oluşturuyor.

    PhpStorm'u kilitlemenin durum olup olmadığını kontrol etmek için kapattım (tersi de olabilirdi). Bu benim sorunumu çözdü.


2

Aynı hata mesajını aldım. Sonunda komutta tablonun adını yanlış yazdığımı anladım:

ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES country (id);

karşı

ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES countries (id);

Acaba MySQL neden böyle bir tablonun olmadığını söyleyemez ...


1

MyISAM'den az önce bahsedildi. Basitçe eklemeyi deneyin MOTORU = MyISAM DEFAULT CHARSET = latin1 AUTO_INCREMENT = 2; Diğer tablolarınızın MyISAM ile oluşturulduğunu varsayarak bir ifadenin sonunda.

CREATE TABLE IF NOT EXISTS `tablename` (
  `key` bigint(20) NOT NULL AUTO_INCREMENT,
  FOREIGN KEY `key` (`key`) REFERENCES `othertable`(`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

1

Benim durumumda, bir tablo InnoB ve diğeri MyISAM olduğunda oldu. MySQL Workbench aracılığıyla bir tablonun motorunu değiştirmek benim için çözer.


1

Benim durumumda oldu, çünkü kısıtlama bildiriminde başvurulan tablonun adı doğru değildi (tablo adındaki büyük durumu unuttum):

ALTER TABLE `Window` ADD CONSTRAINT `Windows_ibfk_1` FOREIGN KEY (`WallId`) REFERENCES `Wall` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

1

her iki tablonun da aynı InnoDB MyISAM şemasına sahip olup olmadığını kontrol edin. InnoDB davamda hepsini aynı yaptım ve çalıştım


1

Sorunum listelenmemişti, çok aptalca bir şeydi ..... FKas PK'ye sahip tablo şu PKşekilde bildirilmiş bir bileşikti : birincil anahtar ( CNPJ, CEP) CEP alanının FKbaşka bir tabloda olmasını istedim ve Bu hataya takılıp kalan hikayenin ahlaki değeri, yukarıdaki kodu Birincil anahtar ( CEP, CNPJ) için tersine çevirdi ve işe yaradı. Arkadaşlarına bahşiş alın.

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.