HATA 1452: Alt satır eklenemiyor veya güncellenemiyor: yabancı anahtar kısıtlaması başarısız oluyor


132

MySQL Workbench'te aşağıda gösterildiği gibi tablolar oluşturdum:

ORDRE tablosu:

CREATE TABLE Ordre (
  OrdreID   INT NOT NULL,
  OrdreDato DATE DEFAULT NULL,
  KundeID   INT  DEFAULT NULL,
  CONSTRAINT Ordre_pk PRIMARY KEY (OrdreID),
  CONSTRAINT Ordre_fk FOREIGN KEY (KundeID) REFERENCES Kunde (KundeID)
)
  ENGINE = InnoDB;

PRODUKT tablosu:

CREATE TABLE Produkt (
  ProduktID          INT NOT NULL,
  ProduktBeskrivelse VARCHAR(100) DEFAULT NULL,
  ProduktFarge       VARCHAR(20)  DEFAULT NULL,
  Enhetpris          INT          DEFAULT NULL,
  CONSTRAINT Produkt_pk PRIMARY KEY (ProduktID)
)
  ENGINE = InnoDB;

ve ORDRELINJE tablosu:

CREATE TABLE Ordrelinje (
  Ordre         INT NOT NULL,
  Produkt       INT NOT NULL,
  AntallBestilt INT DEFAULT NULL,
  CONSTRAINT Ordrelinje_pk PRIMARY KEY (Ordre, Produkt),
  CONSTRAINT Ordrelinje_fk FOREIGN KEY (Ordre) REFERENCES Ordre (OrdreID),
  CONSTRAINT Ordrelinje_fk1 FOREIGN KEY (Produkt) REFERENCES Produkt (ProduktID)
)
  ENGINE = InnoDB;

bu yüzden ORDRELINJEtabloya değer eklemeye çalıştığımda şunu elde ederim :

Hata Kodu: 1452. Alt satır eklenemez veya güncellenemez: yabancı anahtar kısıtlaması başarısız olur ( srdjank. Ordrelinje, CONSTRAINT Ordrelinje_fkFOREIGN KEY ( Ordre) REFERENCES Ordre( OrdreID))

Bu konudaki diğer gönderileri de gördüm ama şansım yok. Bir şeyi denetliyor muyum veya ne yapacağım konusunda herhangi bir fikrim var mı?


Yanıtlar:


173

FOREIGN KEY Kısıtlamalarının Kullanılmasından Alınmıştır

Yabancı anahtar ilişkileri, merkezi veri değerlerini tutan bir üst tabloyu ve üstünü gösteren aynı değerlere sahip bir alt tabloyu içerir. FOREIGN KEY yan tümcesi alt tabloda belirtilmiştir.

Üst tabloda eşleşen bir aday anahtar değeri yoksa, bir alt tabloda yabancı anahtar değeri yaratmaya çalışan herhangi bir INSERT veya UPDATE işlemini reddeder.

Dolayısıyla, hatanız Error Code: 1452. Cannot add or update a child row: a foreign key constraint failsesasen Ordrelinjetablonuza , tabloda eşleşen bir satırın (OrderID) bulunmadığı bir satır eklemeye çalıştığınız anlamına gelir Ordre.

Önce satırı Ordretablonuza eklemelisiniz .


Veya yabancı anahtarı bırakıp, veri girdikten sonra yabancı anahtarı ekleyebilir miyiz?
Vamsi Pavan Mahesh

@VamsiPavanMahesh, HAYIR, çünkü bunu yapsanız bile; Anahtar veri uyuşmazlığı olacağından, önceden belirlenmiş anahtar oluşturma işleminiz aynı tür bir hatayla başarısız olacaktır.
Rahul

4
Basitçe söylemek gerekirse, eğer çocukların ebeveyn kimlikleri tanımlanmışsa, bu ebeveynlerin var olması gerekir. Ve sözdizimimin yanlış olduğunu düşündüm ... Bana çok yardımcı oldu. Teşekkürler!
wst

2
Ya isteğe bağlı ilişkiler?
Hamed Hamedi

40

Bu kısıtlama kontrolünü alıyorsunuz çünkü Ordretablo, OrdreIDinsert komutunda sağlanan referansa sahip değil .

Değeri eklemek için Ordrelinje, önce değeri girmek zorunda Ordremasa ve aynı kullanmak OrdreIDiçinde Orderlinjemasaya.

Ya da boş olmayan kısıtlamayı kaldırıp içine bir NULL değeri ekleyebilirsiniz.


30

Ana tablo birincil anahtarına karşılık gelen yabancı anahtar değeri olmayan alt tablodaki verileri silmeniz veya alt tablodaki tüm verileri silmeniz ve ardından üst tablodaki birincil anahtarla aynı yabancı anahtar değerine sahip yeni verileri eklemeniz gerekir. . Bu çalışmalı. Burada ayrıca bir youtube videosu


1
Bu doğrudur, pivot tabloya veri eklemeden önce (KADEMELİ kısıtlamalara sahip olanlar), üst tablolara veri eklemeniz gerekir. örneğin 1. tablo - izinler; 2. tablo - roller; 3. tablo - izin_rol; Yani 1. izinler tablosuna ekle, 2. rol tablosuna ekle ve son olarak permi_role tablosuna ekle.
Deepak Panwar

25

Sorun YABANCI ANAHTAR Kısıtlaması ile ilgilidir. Varsayılan olarak (SET FOREIGN_KEY_CHECKS = 1). FOREIGN_KEY_CHECKS seçeneği, InnoDB tabloları için yabancı anahtar kısıtlamalarının kontrol edilip edilmeyeceğini belirtir. MySQL - SET FOREIGN_KEY_CHECKS

Query'yi çalıştırmadan önce yabancı anahtar kontrolünü devre dışı bırakabiliriz. Yabancı anahtarı devre dışı bırakın .

Sorgunuzu çalıştırmadan önce bu satırlardan birini çalıştırın, ardından sorgunuzu başarıyla çalıştırabilirsiniz. :)

1) Oturum için (önerilir)

SET FOREIGN_KEY_CHECKS=0;

2) Küresel

SET GLOBAL FOREIGN_KEY_CHECKS=0;

19

İçinde bazı değerlere sahip olduğundan, bu hata genellikle oluşur referans var olmayan çocuk masanın alanında başvurulan / aday ana tablodaki alanında.

Bazen, bu hatayı mevcut tablolara Yabancı Anahtar kısıtlamalarını uygularken, içlerinde zaten veri varken alabiliriz . Diğer cevaplardan bazıları, verilerin alt tablodan tamamen silinmesini ve ardından kısıtlamanın uygulanmasını önermektedir. Ancak, alt tabloda zaten çalışma / üretim verilerimiz olduğunda bu bir seçenek değildir. Çoğu senaryoda, alt tablodaki verileri (onları silmek yerine) güncellememiz gerekecektir .

Şimdi, Left Joinüst tabloda eşleşen değerlere sahip olmayan tüm bu satırları alt tablodaki bulmak için kullanabiliriz . Eşleşmeyen satırları getirmek için aşağıdaki sorgu yararlı olacaktır:

SELECT child_table.* 
FROM child_table 
LEFT JOIN parent_table 
  ON parent_table.referenced_column = child_table.referencing_column 
WHERE parent_table.referenced_column IS NULL

Şimdi, verileri düzeltmek için genellikle aşağıdaki adımlardan birini (veya daha fazlasını) yapabilirsiniz.

  1. "İş mantığınıza" bağlı olarak, bu eşleşmeyen değerleri üst tablodaki mevcut değerlerle güncellemeniz / eşleştirmeniz gerekecektir. Bazen onları nullda ayarlamanız gerekebilir .
  2. Eşleşmeyen değerlere sahip bu satırları silin.
  3. Üst tablonuza, alt tablodaki eşleşmeyen değerlere karşılık gelen yeni satırlar ekleyin.

Veriler düzeltildikten sonra, ALTER TABLEsözdizimini kullanarak Yabancı anahtar kısıtlamasını uygulayabiliriz .


Tablodaki tüm verileri siliyorum ve ardından yabancı anahtar ekledim, teşekkür ederim
Sumit Kumar Gupta

4

yabancı anahtar tablosunda, ilişkili olacak birincil anahtar tablosunda sahip olunmayan bir değer var, bu nedenle önce tüm verileri silmeniz / yabancı anahtar tablonuzun değerini birincil anahtarınızda bulunan değere göre ayarlamanız gerekir


3

Üst tablomda alt tablomda başvurduğum tüm değerlere sahip olmasına rağmen bu sorunu alıyordum. Sorun, tek bir yabancı anahtara birden çok alt başvuru ekleyemememdi. Başka bir deyişle, aynı yabancı anahtara başvuran beş satır veriye sahip olsaydım, MySQL yalnızca ilk satırı yüklememe izin veriyor ve bana 1452 hatası veriyordu.

Benim için işe yarayan şey "SET GLOBAL FOREIGN_KEY_CHECKS = 0" kodunu yazmaktı. Bundan sonra MySQL'i kapattım ve yeniden başlattım ve tüm verilerimi hatasız bir şekilde yükleyebildim. Daha sonra FOREIGN_KEY_CHECKS'in ne yaptığından tam olarak emin olmasam da sistemi normale döndürmek için "SET GLOBAL FOREIGN_KEY_CHECKS = 1" yazdım. Bu yardımcı olur umarım!


@ Mr-Faizan tarafından yayınlanan cevapta daha önce önerilen bu değil mi? Değilse, lütfen cevabınızın neler kattığını açıklayın.
Adrian Mole

2

Bu, ilgili kayıtları önce Ana tabloya ekleyerek düzeltilebilir ve ardından Alt tablonun ilgili sütununa kayıtları ekleyebiliriz. Ayrıca sütunun veri türünü ve boyutunu da kontrol edin. Üst tablo sütunu ile aynı olmalı, hatta motor ve harmanlama da aynı olmalıdır. BUNU DENE! Benimkini böyle çözdüm. Yanılıyorsam düzeltin.


1

Sizin ORDRELINJEtablo ile bağlantılı ORDERtablo yabancı anahtar kısıtlamasını kullanarak constraint Ordrelinje_fk foreign key(Ordre) references Ordre(OrdreID)Buna göre Ordre int NOT NULL,tablonun sütun ORDRELINJEherhangi eşleşmelidir Ordre int NOT NULL,sütununu ORDERmasaya.

Şimdi burada olan şey, ORDRELINJEtabloya yeni satır eklediğinizde , fk kısıtlamasına göre tablonun mevcut olup olmadığını Ordrelinje_fkkontrol ediyor ve herhangi bir OrderId ile eşleşmediği için Compiler yabancı anahtar ihlalinden şikayet ediyor. Bu hatayı almanızın nedeni budur.ORDEROrdreID

Yabancı anahtar, her ikisi arasında bağlantı kurmak için herhangi bir tabloda kullandığınız diğer tablonun birincil anahtarıdır. Bu anahtar, tabloyu oluştururken belirttiğiniz yabancı anahtar kısıtlamasına bağlıdır. Veriler üzerindeki herhangi bir işlem bu kısıtlamayı ihlal etmemelidir. Bu kısıtlamanın ihlali bunun gibi hatalara neden olabilir.

Umarım netleştirmişimdir.


1

Yabancı anahtar öznitelik değerlerini eklerken, önce öznitelik türünü ve üst ilişkideki birincil anahtar öznitelik değerini doğrulayın, üst ilişkideki değerler eşleşirse, alt öznitelik değerlerini kolayca ekleyebilir / güncelleyebilirsiniz.



1

Bu, @ Bay-Faizan'ı ve diğer cevapları okuduktan sonra bana yardımcı oldu.

"Yabancı anahtar kontrollerini etkinleştir" seçeneğinin işaretini kaldırın

phpMyAdmin'de ve sorguyu tıklayın. WorkBench hakkında bir bilgim yok ama diğer cevaplar size yardımcı olabilir.


0

her tabloya en az bir tane ham eklemelisiniz (yabancı anahtarların işaret etmesini istediğiniz tablolar) sonra yabancı anahtarların değerlerini ekleyebilir veya güncelleyebilirsiniz.


0

bunu buraya sıkıştıracağım: benim durumum var olmayan bir gönderi için bir beğeni yaratmaya çalışıyordu; veritabanına işlenirken hata oluştu. çözüm, önce gönderiyi oluşturmak sonra beğenmektir. benim anlayışıma göre, post_id beğeniler tablosuna kaydedilecekse, varlığını tespit etmek için önce postlar tablosunu kontrol etmesi gerekiyordu. Bu şekilde olması benim için daha mantıklı olduğu için daha iyi buldum ..


0

Kullandığınız zaman yabancı anahtar , senin sütunların sırasının aynı olmalıdır için ekleme .

Örneğin, ekliyorsanız (userid, password)içinde table1 gelen tablo2 gelen sonra table2 sırayla aynı olmalıdır (userid, password)ve değil gibi (password,userid) nerede useridolduğu yabancı anahtar içinde tablo2 arasında tablo1 .


0

Sorun, alt tabloya bazı veriler ekledikten sonra yabancı anahtarı alt tabloda ayarladığınız için oluşur.

Tüm verileri alt tablodan kaldırmayı deneyin, ardından yabancı anahtarı ayarlayın ve ardından verileri tabloya ekleyin / ekleyin, çalışacaktır.


0

hayır kontrol edin. Üst tablodaki alt tablodaki kayıt ve ayrıca birincil anahtar yabancı anahtar referansıyla eşleşmelidir. Bu benim için çalışıyor.


-4

% 100 çalışıyor ...

HATA 1452: Bir alt satır eklenemez veya güncellenemez: bir yabancı anahtar kısıtlaması başarısız olur .... bu tür bir hata meydana gelirse: sonra Öncelikle bu tabloya gidin ve ayarı kontrol edin> Motor ise: InnoDB sonra MyISAM olarak değiştirin

(ve yabancı kısıtlama referanslarını silin)

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.