MySQL Hatası 1215: Yabancı anahtar kısıtlaması eklenemiyor


336

Benim db sunucuma yeni şemasını iletmek çalışıyorum, ama neden bu hatayı alıyorum anlayamıyorum. Burada cevabı aramaya çalıştım, ama bulduğum her şey db motorunu Innodb'a ayarlamayı ya da yabancı bir anahtar olarak kullanmaya çalıştığım anahtarların kendi tablolarındaki birincil anahtarlar olduğundan emin olmak için söyledi . Yanılmıyorsam, her ikisini de yaptım. Size sunabileceğiniz başka herhangi bir yardım?

Executing SQL script in server

ERROR: Error 1215: Cannot add foreign key constraint

-- -----------------------------------------------------
-- Table `Alternative_Pathways`.`Clients_has_Staff`
-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients_has_Staff` (
  `Clients_Case_Number` INT NOT NULL ,
  `Staff_Emp_ID` INT NOT NULL ,
  PRIMARY KEY (`Clients_Case_Number`, `Staff_Emp_ID`) ,
  INDEX `fk_Clients_has_Staff_Staff1_idx` (`Staff_Emp_ID` ASC) ,
  INDEX `fk_Clients_has_Staff_Clients_idx` (`Clients_Case_Number` ASC) ,
  CONSTRAINT `fk_Clients_has_Staff_Clients`
    FOREIGN KEY (`Clients_Case_Number` )
    REFERENCES `Alternative_Pathways`.`Clients` (`Case_Number` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_Clients_has_Staff_Staff1`
    FOREIGN KEY (`Staff_Emp_ID` )
    REFERENCES `Alternative_Pathways`.`Staff` (`Emp_ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

SQL komut dosyası yürütme tamamlandı: ifadeler: 7 başarılı, 1 başarısız

İşte üst tablolar için SQL.

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients` (
  `Case_Number` INT NOT NULL ,
  `First_Name` CHAR(10) NULL ,
  `Middle_Name` CHAR(10) NULL ,
  `Last_Name` CHAR(10) NULL ,
  `Address` CHAR(50) NULL ,
  `Phone_Number` INT(10) NULL ,
  PRIMARY KEY (`Case_Number`) )
ENGINE = InnoDB

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Staff` (
  `Emp_ID` INT NOT NULL ,
  `First_Name` CHAR(10) NULL ,
  `Middle_Name` CHAR(10) NULL ,
  `Last_Name` CHAR(10) NULL ,
  PRIMARY KEY (`Emp_ID`) )
ENGINE = InnoDB

6
Lütfen üst tabloların şemasını gönderin: Clientsve Staff.
Ike Walker


1
OP, sütunların üst tablolarda PKs olduğunu doğruladıklarını söylediğinden, muhtemelen bu bir kopya değil.
Ike Walker

İstemciler ve Personel tabloları için SQL deyimlerini istendiği gibi ekledim.
Robert B

Yanıtlar:


593

Bunu tahmin ediyorum Clients.Case_Numberve / veya Staff.Emp_IDtam olmayan aynı veri tipi Clients_has_Staff.Clients_Case_Numberve Clients_has_Staff.Staff_Emp_ID.

Belki de üst tablolardaki sütunlar INT UNSIGNED?

Her iki tabloda da tam olarak aynı veri türüne sahip olmaları gerekir.


10
Teşekkürler. Sorun ortaya çıktı. Referans sütunu bir INT iken Staff.Emp_ID bir SMALLINT'ti. Bazen küçük şeyler ...
Robert B

Tks. Benim durumumda, alt tabloda tam olarak üst tablonun sütunu ile eşleşmediği anlamına gelen yabancı anahtarda "ZeroFill" i tıkladım.
wwkudu

12
Karakter setinin farklı olması da olabilir. Ben bir sütun utf8 karakter kümesi diğer ise latin1 vardı bu sorundan. ALTER MASA TableKARAKTER SETİ = utf8 ile kolayca sabitlenir ; ve ALTER TABLE DeviceCHANGE COLUMN ID IDCHAR (36) KARAKTER SETİ 'utf8' BOŞ DEĞİL;
www.jensolsson.se

3
@ www.jensolsson.se Haklısınız, PK bir veya daha fazla dize sütunu içeriyorsa, aynı karakter kümesini ve harmanlamayı kullanmaları gerekir . Bu özel durumda PK bir INT idi, bu nedenle tablonun ve / veya sütunların karakter kümesi ilgili değildi.
Ike Walker

2
Harmanlama benim sorunum, latin1 vs utf8 (tablo VE sütun).
ben_979

244

Yabancı anahtar kısıtlama hatası almanızın nedenleri:

  1. Tüm tablolarda motor olarak InnoDB kullanmıyorsunuz.
  2. Hedef tabloda varolmayan bir anahtara başvurmaya çalışıyorsunuz. Diğer tabloda bir anahtar olduğundan emin olun (birincil veya benzersiz bir anahtar olabilir)
  3. Sütun türleri aynı değildir (istisna, referans tablosundaki sütun geçersiz olabilir).
  4. PK / FK bir varchar ise, harmanlamanın her ikisi için de aynı olduğundan emin olun.

Güncelleme:

  1. Bunun nedenlerinden biri, kullandığınız sütunun ON DELETE SET NULLboş olarak tanımlanmaması olabilir. Bu nedenle sütunun varsayılan null olarak ayarlandığından emin olun.

Bunları kontrol edin.


14
Ben sadece FK bir karakter sütununda ise, ben aynı karakter ve harmanlama olması gerektiğini düşünüyorum ekleyeceğim. (Veya muhtemelen 1 bayt ve 2 baytlık karakter kümeleri uyumlu değildir.)
Graham Charles

5
Benim nedeniniz ilk "İki tablo, InnoDB ve MyISAM için farklı DB Motorları" işaret etti
Randika Vishman

7
Başka bir nedenim var =) `` `GÜNCELLEME SETİ NULL'DA SİLİNDİR SİLME:` `` Bazı sütunlar BOş DEĞİL olarak tanımlanmış olsa da, SET NULL koşulunu tanımladınız. Yani, sadece FK tanımını düzeltiyorum.
alexglue

1
Ayrıca olası arıza, hedef alanda indeks olmamasıdır .
Paul T. Rawkeen

1
güzel, 4. nokta benim sorunum oldu. Biraz kötü - ama bunun için çok mutluyum mysql bunun için
çöktü

85

Diğerleri için aynı hata her zaman sütun türü uyuşmazlığından kaynaklanmayabilir, komutu vererek mysql foriegn anahtar hatası hakkında daha fazla bilgi bulabilirsiniz.

SHOW ENGINE INNODB STATUS;

yazdırılan iletinin üst kısmına yakın bir hata

Başvurulan tabloda, başvurulan sütunların ilk sütun olarak göründüğü bir dizin bulunamıyor veya tablodaki ve başvurulan tablonun sütun türleri kısıtlama ile eşleşmiyor.


13
Bu tanı yardımcı olur düşünüyorum en iyi cevap budur! Teşekkürler.
alexglue

Bu nasıl olmalı? Her iki sorgu üst üste çalıştırılsın mı?
C4d

@ C4u, evet önce MOTOR INNODB DURUMUNU GÖSTER ve ardından diğer sorguları takip ederek her iki sorguyu üst üste yürütmeliyiz
sureshd

PHPMyAdmin üzerinde yapmak işe yaramaz. komut isteminde yapın.
ruwan800

13

Hata 1215 sinir bozucu bir hata. Patlama Hapının cevabı temel bilgileri kapsar. Oradan başlamak istediğinizden emin olmak istiyorsunuz. Bununla birlikte, dikkat edilmesi gereken daha, çok daha ince vakalar var:

Örneğin, farklı tabloların PRIMARY KEY'lerini bağlamaya çalıştığınızda, uygun ON UPDATEve ON DELETEseçenekleri sağladığınızdan emin olun . Örneğin:

...
PRIMARY KEY (`id`),
FOREIGN KEY (`id`) REFERENCES `t` (`other_id`) ON DELETE SET NULL
....

PRIMARY KEY ((gibi id) olamaz NULL.

Eminim, bu tür kısıtlamaları eklerken daha fazla, benzer şekilde ince konular vardır, bu yüzden kısıtlama hatalarıyla karşılaştığınızda, her zaman kısıtlamaların ve etkilerinin mevcut bağlamınızda mantıklı olduğundan emin olun. Hata 1215 ile iyi şanslar!


1
Orada olmayan bir yabancı anahtarı silmeye çalışırsanız da bu hatayı alırsınız :)
Explosion Pills

2
Ayrıca, dokümanlardan: MySQL, yabancı anahtarlar ve başvurulan anahtarlar üzerinde dizinler gerektirir, böylece yabancı anahtar denetimleri hızlı olabilir ve tablo taraması gerektirmez. Referans tablosunda, yabancı anahtar sütunlarının aynı sırada ilk sütun olarak listelendiği bir dizin olmalıdır . Böyle bir indeks, mevcut değilse referans tablosunda otomatik olarak oluşturulur. Yabancı anahtar kısıtlamasını uygulamak için kullanılabilecek başka bir dizin oluşturursanız, bu dizin daha sonra sessizce bırakılabilir. Dizin_adı, belirtilmişse, daha önce açıklandığı gibi kullanılır.
Jonathan M

1
Bu yüzden buraya geldim: ON DELETE SET NULLOlmak istediğim bir sütunda yabancı bir anahtar yaratmaya çalıştım NOT NULL. Diyelim ki pastanızı yiyip yiyemezsiniz.
Martin Hennings

8

Tablonun harmanlamasını SHOW TABLE STATUSkontrol edin , kullanarak harmanlama da dahil olmak üzere tablolarla ilgili bilgileri kontrol edebilirsiniz.

Her iki tablonun da aynı harmanlamaya sahip olması gerekir.

Bana oldu.


Benim durumumda sorun buydu - MySQL hatası hiç yardımcı olmadı!
Juddling

7

Benim durumumda SET FOREIGN_KEY_CHECKS=0, sonra kullanarak bir tablo silmişti SET FOREIGN_KEY_CHECKS=1. Masayı yeniden yüklemeye gittiğimde aldım error 1215. Sorun, veritabanında sildiğim ve yeniden yüklediğim tablonun yabancı anahtarı olan başka bir tablo olmasıydı. Yeniden yükleme işleminin bir kısmı, alanlardan biri için diğer tablodaki yabancı anahtarı geçersiz yapan ve böylece tetikleyen bir veri türünün değiştirilmesini içeriyordu error 1215. Sorunu, ilgili tablo için yeni veri türüyle diğer tabloyu bırakarak ve yeniden yükleyerek çözdüm.


5

Bir fk eklemeye çalışırken aynı hatayı aldım. Benim durumumda, sorun FK tablosunun imzalanmamış olarak işaretlenmiş PK'sından kaynaklandı.


5

Laravel 4 kullanırken, özellikle JeffreyWay'in Laravel 4 Jeneratörleri ile "Hata 1215: Yabancı anahtar kısıtı eklenemiyor" ile yaşadığım bir tuzak var.

Laravel 4'te tek tek tablolar oluşturmak üzere geçiş dosyaları oluşturmak için JeffreyWay'ın Jeneratörlerini kullanabilirsiniz, yani her geçiş dosyası bir tablo oluşturur. Her geçiş dosyasının dosya adında bir zaman damgası ile oluşturulduğunu ve dosyalara bir sipariş verdiğinin farkında olmalısınız. Üretim sırası, Artisan CLI "php artisan migrate" komutunu çalıştırdığınızda geçiş işlemidir. Bu nedenle, bir dosya ikinci bir dosyada oluşturulacak, ancak henüz oluşturulmayacak bir anahtara yabancı anahtar kısıtlaması isterse, Hata 1215 tetiklenir. Bu durumda, yapmanız gereken taşıma dosyaları oluşturma sırasını ayarlamaktır. Yeni dosyaları uygun sırayla oluşturun, içeriği kopyalayın, ardından bozuk eski dosyaları silin.


3

aynı sorunu vardı, benim çözüm:

Önce:

CREATE TABLE EMPRES
( NoFilm smallint NOT NULL

  PRIMARY KEY (NoFilm)

  FOREIGN KEY (NoFilm) REFERENCES cassettes

);

Çözüm:

CREATE TABLE EMPRES
(NoFilm smallint NOT NULL REFERENCES cassettes,

 PRIMARY KEY (NoFilm)

);

Umarım yardımcı olur;)


1
İlk
OLUŞTURUNUZDA

3

Ben de aynı problemi yaşadım.
Bunu yaparak çözdüm:

Aşağıdaki satırı oluşturdum
primary key: (id int(11) unsigned NOT NULL AUTO_INCREMENT)

Şema oluşturucuma bir tablo aktarmaya çalıştıktan sonra bu çözümü öğrendim. İşinize yarıyorsa, bana bildirin!

İyi şanslar!

Felipe Tércio


3

Sadece bu konuyu VARCHARyabancı anahtar ilişkisi için de eklemek istedim . Geçen hafta MySQL Workbench 8.0 bu anlamaya çalışırken geçirdi ve sonunda hatayı düzeltmek mümkün.

Kısa Yanıt: Şema, tablo, sütun, başvuru tablosu, başvuru sütunu ve üst tabloya başvuran diğer tabloların karakter kümesi ve harmanlaması eşleşmelidir.

Uzun Cevap: Masamda bir ENUM veri türü vardı. Bunu olarak değiştirdim VARCHARve ek seçenekler eklemek için üst tabloyu değiştirmek zorunda kalmamak için değerleri bir referans tablosundan alabilirim. Bu yabancı anahtar ilişkisi basit görünüyordu ama 1215 hatası aldım. Arvind'un yanıtı ve aşağıdaki bağlantı ,

SHOW ENGINE INNODB STATUS;

Bu komutu kullanırken, ek yararlı bilgi olmadan hata için aşağıdaki ayrıntılı açıklamayı aldım

Başvurulan tabloda, başvurulan sütunların ilk sütun olarak göründüğü bir dizin bulunamıyor veya tablodaki ve başvurulan tablonun sütun türleri kısıtlama ile eşleşmiyor. ENUM ve SET'in dahili depolama türüne> = InnoDB-4.1.12 ile oluşturulan tablolarda değiştiğini ve eski tablolardaki bu tür sütunlara yeni tablolardaki bu tür sütunlar tarafından referans verilemeyeceğini unutmayın. Doğru yabancı anahtar tanımı için lütfen http://dev.mysql.com/doc/refman/8.0/en/innodb-foreign-key-constraints.html adresine bakın .

Bundan sonra ben kullanılan SET FOREIGN_KEY_CHECKS=0;olarak önerdiği Arvind Bharadwaj ve bağlantı burada :

Bu, aşağıdaki hata iletisini verdi:

Hata Kodu: 1822. Yabancı anahtar kısıtlaması eklenemedi. Kısıtlama için eksik dizin

Bu noktada, şemayı 'tersine mühendislik' ettim ve EER diyagramında yabancı anahtar ilişkisi kurabildim. 'İleri mühendislik' konusunda şu hatayı aldım:

Hata 1452: Bir alt satır eklenemiyor veya güncellenemiyor: yabancı anahtar kısıtlaması başarısız

EER diyagramını yeni bir şemaya 'ilettiğimde', SQL betiği sorunsuz çalıştı. Oluşturulan SQL'i mühendis iletme girişimlerinden karşılaştırırken, farkın karakter kümesi ve harmanlama olduğunu buldum. Üst tablo, alt tablo ve iki sütun utf8mb4karakter kümesine ve utf8mb4_0900_ai_ciharmanlamaya sahipti , ancak üst tablodaki başka bir sütuna CHARACTER SET = utf8 , COLLATE = utf8_bin ;farklı bir alt tablo kullanılarak başvuruldu .

Tüm şema için, tüm tablolar ve tüm sütunlar için karakter kümesini ve harmanlamayı şu şekilde değiştirdim:

CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

Bu nihayet 1215 hatası ile benim sorunum çözüldü.

Yan Not: Harmanlama utf8mb4_general_ciMySQL Workbench 5.0 veya sonraki sürümlerinde çalışır. Harmanlama utf8mb4_0900_ai_ciyalnızca MySQL Workbench 8.0 veya üstü için çalışır. Karakter kümesi ve harmanlama ile ilgili sorunlarımın nedenlerinden birinin MySQL Workbench'in 8.0'a yükseltilmesinden kaynaklandığına inanıyorum. İşte bu harmanlama hakkında daha fazla konuşan bir bağlantı .


2

Bu hatayı bulamıyorum

CREATE TABLE RATING (

Riv_Id INT(5),
Mov_Id INT(10) DEFAULT 0,
Stars INT(5),
Rating_date DATE, 

PRIMARY KEY (Riv_Id, Mov_Id),

FOREIGN KEY (Riv_Id) REFERENCES REVIEWER(Reviewer_ID)
ON DELETE SET NULL ON UPDATE CASCADE,

FOREIGN KEY (Mov_Id) REFERENCES MOVIE(Movie_ID)
ON DELETE SET DEFAULT ON UPDATE CASCADE
)

2

Bu, sütunların türü aynı olmadığında da olur.

örneğin, atıfta bulunduğunuz sütun UNSIGNED INT ve atıfta bulunulan sütun INT ise, bu hatayı alırsınız.


2

MySQL (INNODB) için ... bağlamak istediğiniz sütunların tanımlarını alın

SELECT * FROM information_schema.columns WHERE 
TABLE_NAME IN (tb_name','referenced_table_name') AND 
COLUMN_NAME  IN ('col_name','referenced_col_name')\G

her iki sütun tanımının karşılaştırmasını ve doğrulamasını

aynı COLUMN_TYPE (uzunluk), aynı COLATION

gibi oynamak için yardımcı olabilir

set foreign_key_checks=0;
ALTER TABLE tb_name ADD FOREIGN KEY(col_name) REFERENCES ref_table(ref_column) ON DELETE ...
set foreign_key_checks=1;

2

Tablo uyumluluğunu kontrol edin. Bir tablodur Örneğin, MyISAMdiğeri ise InnoDB, bu sorunu olabilir.


2

Başka bir neden: yabancı anahtarda kullanılan ON DELETE SET NULL tüm sütunları kullanırsanız null değerlere izin vermelisiniz. Bu soruda başka biri bunu öğrendi .

Anladığım kadarıyla veri bütünlüğü ile ilgili bir sorun olmazdı, ancak MySQL'in bu özelliği desteklemediği anlaşılıyor (5.7'de).


1

Başvurulan tablo MyISAM motorunu kullandığından bu hata oluştuğunda, bu yanıt veritabanınızı dönüştürmek için hızlı bir yol sağlar, böylece tüm Django model tabloları InnoDB kullanır: https://stackoverflow.com/a/15389961/2950621

Convert_to_innodb adlı bir Django yönetim komutudur.


1

Wooo anladım! Zaten gönderilen cevapların (innoDB, unsigned, vs) bir karışımıydı. Burada görmediğim bir şey var: FK'niz bir PK'ye işaret ediyorsa, kaynak sütununun anlamlı bir değere sahip olduğundan emin olun. Örneğin, PK bir orta-çizgi (8) ise, kaynak sütunun da bir orta-çizgi (8) içerdiğinden emin olun. Bu benim için sorunun bir parçasıydı.


1

Benim için sütun türleri vardı. BigINT! = INT.

Ama sonra hala işe yaramadı.

Motorları kontrol ettim. Table1 = InnoDB ve Table = InnoDB olduğundan emin olun


1

Bu hatayı tamamen farklı bir nedenden dolayı yaşadım. Veri Modelimi oluşturmak için MySQL Workbench 6.3 kullandım (harika bir araç). Yabancı Anahtar kısıt tanımında tanımlanan sütun sırası tablo sütun dizisine uymadığında bu hatanın da oluştuğunu fark ettim.

Her şeyi denemek ama bunu kontrol etmek yaklaşık 4 saat sürdü.

Şimdi her şey iyi çalışıyor ve kodlamaya geri dönebilirim. :-)


Bununla ne demek istiyorsun?
Yazan Jaber

2
Bence @YazanJaber O demektir bu : InnoDB'nin sütunların herhangi indeks sütunu veya grubu başvurmak için yabancı bir anahtar izin verir. Ancak, başvurulan tabloda, başvurulan sütunların aynı sırada ilk sütun olarak listelendiği bir dizin olmalıdır.
17'de robsch

1

laravel geçişi kullanırken yabancı anahtar yapmaya çalıştığınızda

bu örnek gibi:

kullanıcı tablosu

    public function up()
{
    Schema::create('flights', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->TinyInteger('color_id')->unsigned();
        $table->foreign('color_id')->references('id')->on('colors');
        $table->timestamps();
    });
}

renkler tablosu

    public function up()
{
    Schema::create('flights', function (Blueprint $table) {
        $table->increments('id');
        $table->string('color');
        $table->timestamps();
    });
}

bazen özellikler işe yaramadı

[PDOException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

bu hata, [kullanıcı tablosu] 'ndaki yabancı anahtar (tür) [renkler tablosu]' ndaki birincil anahtardan (tür) farklı olduğu için oldu

Bu sorunu çözmek için [renk tablosu] 'ndaki birincil anahtarı değiştirmelisiniz

$table->tinyIncrements('id');


Birincil anahtarı kullandığınızda $table->Increments('id');

Integeryabancı anahtar olarak kullanmalısın

    $table-> unsignedInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

Birincil anahtarı kullandığınızda $table->tinyIncrements('id');

unsignedTinyIntegeryabancı anahtar olarak kullanmalısın

    $table-> unsignedTinyInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

Birincil anahtarı kullandığınızda $table->smallIncrements('id');

unsignedSmallIntegeryabancı anahtar olarak kullanmalısın

    $table-> unsignedSmallInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

Birincil anahtarı kullandığınızda $table->mediumIncrements('id');

unsignedMediumIntegeryabancı anahtar olarak kullanmalısın

    $table-> unsignedMediumInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

Bu bana yardımcı oluyor. Ben bigIncrementsben kullanmak için gerekli böylece, birincil anahtar olarakunsignedBigInteger
jagad89

1

Benim durumumda FOREIGN KEYkaynak tabloları olmadığı için çekleri devre dışı bırakmak zorunda kaldım .

SET FOREIGN_KEY_CHECKS=0;


0

Geri tırnakların kullanımının da farkında olun. Bir senaryoda şu ifadeyi aldım

ALTER TABLE service ADD FOREIGN KEY (create_by) REFERENCES `system_user(id)`;

fakat sondaki arka tırnaklar yanlıştı. Olmalıydı:

ALTER TABLE service ADD FOREIGN KEY (create_by) REFERENCES `system_user`(`id`);

MySQL bu hatayla ilgili hiçbir ayrıntı vermedi ...


0

Bu hatanın başka bir kaynağı, aynı yabancı anahtar adlarına sahip 2 veya daha fazla aynı tablo adına sahip olmanızdır. Bu bazen Mysql Workbench gibi modelleme ve tasarım yazılımı kullanan ve daha sonra komut dosyasını tasarımdan üreten insanlara olur.


0

Ben partiye ÇOK geç olduğumu biliyorum ama listelenen böylece buraya koymak istiyorum.

Alanların aynı şekilde tanımlandığından ve tablo türlerinin aynı harmanlamaya sahip olduğundan emin olmak için yukarıdaki tüm tavsiyelerin yanı sıra, ÇOCUK alanındaki verilerin olmadığı alanları bağlamaya çalışırken çaylak hatasını yapmadığınızdan emin olun. zaten PARENT alanında. ÇOCUK alanında, PARENT alanına önceden girmediğiniz veriler varsa, bu hataya neden olur. Hata mesajının biraz daha yararlı olmaması bir utanç.

Emin değilseniz Yabancı Anahtar içeren tabloyu yedekleyin, tüm verileri silin ve ardından Yabancı Anahtar oluşturmaya çalışın. Eğer başarılı olursa ne yapmalısınız!

İyi şanslar.


0

Bu zaten söylenenlerin ince bir versiyonudur, ancak benim durumumda 2 veritabanım (foo ve bar) vardı. İlk önce foo oluşturdum ve bar.baz'da (henüz oluşturulmamış) yabancı bir anahtar olduğunu fark etmedim. Bar.baz oluşturmaya çalıştığımda (herhangi bir yabancı anahtar olmadan), bu hatayı almaya devam ettim. Bir süre etrafa baktıktan sonra yabancı anahtarı foo'da buldum.

Yani, uzun öykü kısa, Bu hatayı alırsanız, oluşturulan tablonun önceden var olan bir yabancı anahtarına sahip olabilirsiniz.


0

Benim için, 1215 hatası tarafından oluşturulmuş bir döküm mysqldumpdosyasını içe aktarırken oluştu , bu da tabloları alfabetik olarak oluşturuyor, bu da benim durumumda yabancı anahtarların dosyada daha sonra oluşturulan tablolara başvurmasına neden oldu. (İşaret etmek için bu sayfanın destekleri: https://www.percona.com/blog/2017/04/06/dealing-mysql-error-code-1215-cannot-add-foreign-key-constraint/ )

Mysqldump siparişler tablolar alfabetik ve tabloların isimlerini değiştirmek istemedim, ben JeremyWeir tarafından cevap talimatı yerine bu sayfada koymak devletler, set FOREIGN_KEY_CHECKS = 0;döküm dosyasının en üstünde ve koymak SET FOREIGN_KEY_CHECKS = 1;dökümü dosyasında altındaki .

Bu çözüm benim için çalıştı.


0

Bu yüzden yukarıdaki tüm düzeltmeleri denedim ve şans yok. Tablolarımda hata eksik olabilir -Sadece nedenini bulamadık ve 1215 hatası almaya devam ettim. Bu yüzden bu düzeltmeyi kullandım.

PhpMyAdmin'deki yerel ortamımda, söz konusu tablodan veri aktardım. CSV biçimini seçtim. Tablo seçiliyken hala phpMyAdmin'deyken "Diğer-> Seçenekler" i seçtim. Burada "Tabloyu şuraya kopyala (database.table) seçeneğine ilerledim." Yalnızca Yapı "yı seçin. Tabloyu yeniden adlandırın, belki sadece geçerli tablo adının yanına" kopya "kelimesini ekleyin." Git "e tıklayın. Yeni tabloyu dışa aktarın ve yeni veya başka bir sunucuya aktarın.Ayrıca burada da phpMyAdmin kullanıyorum. İçe aktarıldıktan sonra tablonun adını orijinal adıyla değiştirin. Yeni tabloyu seçin, içe aktar'ı seçin. "Yabancı anahtar kontrollerini etkinleştir" seçeneğinin işaretini kaldırın. "Git" i seçin. Şimdiye kadar her şey yolunda gidiyor.

Düzeltmemi bloguma gönderdim .


-1

Ben bile aynı sorunu yaşadım. Ve hata FK'nin PK tablosundaki "imzasız" işaretleyicide oldu


-6

Aynı hatayı bir kez yaşadım. Sadece MySQL sunucusunu yeniden başlattım ve sorunu düzelttim.


Bu, sorunu hiç çözmez.
James111
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.