LỖI 1452: Không thể thêm hoặc cập nhật hàng con: ràng buộc khóa ngoại không thành công


132

Tôi đã tạo các bảng trong MySQL Workbench như hình dưới đây:

Bảng ORDRE:

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;

Bảng PRODUKT:

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;

bảng ORDRELINJE:

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;

vì vậy khi tôi cố gắng chèn các giá trị vào ORDRELINJEbảng tôi nhận được:

Mã lỗi: 1452. Không thể thêm hoặc cập nhật hàng con: ràng buộc khóa ngoại không thành công ( srdjank. Ordrelinje, CONSTRAINT Ordrelinje_fkFOREIGN KEY ( Ordre) TÀI LIỆU THAM KHẢO Ordre( OrdreID))

Tôi đã xem các bài viết khác về chủ đề này, nhưng không may mắn. Tôi đang giám sát một cái gì đó hoặc bất kỳ ý tưởng phải làm gì?


Câu trả lời:


172

Được rút ra từ việc sử dụng các Ràng buộc NGOẠI KHÓA

Các mối quan hệ khóa ngoại bao gồm một bảng cha chứa các giá trị dữ liệu trung tâm và một bảng con có các giá trị giống hệt nhau trỏ ngược về cha của nó. Mệnh đề FOREIGN KEY được chỉ định trong bảng con.

Nó sẽ từ chối bất kỳ thao tác CHÈN hoặc CẬP NHẬT nào cố gắng tạo giá trị khóa ngoại trong bảng con nếu không có giá trị khóa ứng viên phù hợp trong bảng mẹ.

Vì vậy, lỗi của bạn Error Code: 1452. Cannot add or update a child row: a foreign key constraint failsvề cơ bản có nghĩa là, bạn đang cố gắng thêm một hàng vào Ordrelinjebảng của mình mà không có hàng nào phù hợp (OrderID) có trong Ordrebảng.

Trước tiên, bạn phải chèn hàng vào Ordrebảng của mình .


Hoặc chúng ta có thể bỏ khóa ngoại sau đó thêm khóa ngoại sau khi chèn dữ liệu?
Vamsi Pavan Mahesh

@VamsiPavanMahesh, KHÔNG, vì ngay cả khi bạn làm điều đó; việc tạo khóa foriegn của bạn sẽ không thành công với cùng một loại lỗi vì sẽ có dữ liệu khóa không khớp.
Rahul

4
Nói một cách đơn giản nếu trẻ em có id cha mẹ được xác định, thì những cha mẹ này phải tồn tại. Và tôi nghĩ rằng cú pháp của tôi đã sai ... Nó đã giúp tôi rất nhiều. Cảm ơn!
WST

2
Còn quan hệ tùy chọn thì sao?
Hamed Hamedi

40

Bạn nhận được kiểm tra ràng buộc này vì Ordrebảng không có tham chiếu OrdreIDđược cung cấp trong lệnh chèn.

Để chèn giá trị vào Ordrelinje, trước tiên bạn phải nhập giá trị vào Ordrebảng và sử dụng giá trị tương tự OrdreIDtrong Orderlinjebảng.

Hoặc bạn có thể loại bỏ ràng buộc not null và chèn giá trị NULL vào đó.


29

Bạn phải xóa dữ liệu trong bảng con không có bất kỳ giá trị khóa ngoại tương ứng nào với khóa chính của bảng mẹ. Hoặc xóa tất cả dữ liệu khỏi bảng con rồi chèn dữ liệu mới có cùng giá trị khóa ngoại với khóa chính trong bảng mẹ . Cần làm việc . Đây cũng là một video youtube


1
Điều này đúng, trước khi chèn dữ liệu vào bảng tổng hợp (có ràng buộc CASCADE), bạn phải chèn dữ liệu vào bảng cha. ví dụ: bảng thứ nhất - quyền; Bảng thứ 2 - các vai trò; Bảng thứ 3 - allow_role; Vì vậy, lần đầu tiên Chèn vào bảng quyền, lần thứ hai chèn vào bảng vai trò và cuối cùng là chèn vào bảng allow_role.
Deepak Panwar

24

Vấn đề là với Ràng buộc NGOẠI KHÓA. Theo mặc định (SET FOREIGN_KEY_CHECKS = 1). Tùy chọn FOREIGN_KEY_CHECKS chỉ định có hay không kiểm tra các ràng buộc khóa ngoại cho các bảng InnoDB. MySQL - SET FOREIGN_KEY_CHECKS

Chúng tôi có thể đặt kiểm tra khóa ngoại là vô hiệu hóa trước khi chạy Truy vấn. Tắt khóa ngoại .

Thực thi một trong những dòng này trước khi chạy truy vấn của bạn, sau đó bạn có thể chạy truy vấn của mình thành công. :)

1) Đối với phiên (khuyến nghị)

SET FOREIGN_KEY_CHECKS=0;

2) Toàn cầu

SET GLOBAL FOREIGN_KEY_CHECKS=0;

19

Lỗi này thường xảy ra vì chúng ta có một số giá trị trong trường tham chiếu của bảng con, không tồn tại trong trường được tham chiếu / ứng viên của bảng mẹ.

Đôi khi, chúng tôi có thể gặp lỗi này khi chúng tôi đang áp dụng các ràng buộc Khóa ngoại cho (các) bảng hiện có, đã có dữ liệu trong chúng . Một số câu trả lời khác là gợi ý xóa dữ liệu hoàn toàn khỏi bảng con, sau đó áp dụng ràng buộc. Tuy nhiên, đây không phải là một tùy chọn khi chúng ta đã có dữ liệu làm việc / sản xuất trong bảng con. Trong hầu hết các trường hợp, chúng tôi sẽ cần cập nhật dữ liệu trong bảng con (thay vì xóa chúng).

Bây giờ, chúng ta có thể tận dụng Left Joinđể tìm tất cả các hàng đó trong bảng con, bảng này không có giá trị phù hợp trong bảng mẹ. Truy vấn sau sẽ hữu ích để tìm nạp các hàng không khớp đó:

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

Bây giờ, bạn có thể thực hiện một (hoặc nhiều) bước sau để sửa dữ liệu.

  1. Dựa trên "logic nghiệp vụ" của bạn, bạn sẽ cần cập nhật / đối sánh (các) giá trị không khớp này với các giá trị hiện có trong bảng chính. Đôi khi bạn cũng có thể cần thiết lập chúng null.
  2. Xóa các hàng có giá trị không khớp này.
  3. Thêm các hàng mới trong bảng mẹ của bạn, tương ứng với các giá trị không khớp trong bảng con.

Sau khi dữ liệu được cố định, chúng ta có thể áp dụng ràng buộc Khóa ngoại bằng ALTER TABLEcú pháp.


Tôi xóa tất cả dữ liệu từ bảng và sau đó thêm khóa ngoại nó đã được thêm vào cảm ơn bạn
Sumit Kumar Gupta

4

trong bảng khóa ngoại có một giá trị không thuộc sở hữu trong bảng khóa chính sẽ có liên quan, vì vậy trước tiên bạn phải xóa tất cả dữ liệu / điều chỉnh giá trị của bảng khóa ngoại theo giá trị có trong khóa chính của bạn


3

Tôi đã gặp sự cố này mặc dù bảng cha của tôi có tất cả các giá trị mà tôi đang tham chiếu trong bảng con của mình. Vấn đề dường như là tôi không thể thêm nhiều tham chiếu con vào một khóa ngoại duy nhất. Nói cách khác, nếu tôi có năm hàng dữ liệu được tham chiếu cùng một khóa ngoại, thì MySQL chỉ cho phép tôi tải lên hàng đầu tiên và cho tôi lỗi 1452.

Điều hiệu quả với tôi là nhập mã "SET GLOBAL FOREIGN_KEY_CHECKS = 0". Sau đó, tôi đóng MySQL rồi khởi động lại nó và tôi có thể tải lên tất cả dữ liệu của mình mà không có lỗi. Sau đó, tôi nhập "SET GLOBAL FOREIGN_KEY_CHECKS = 1" để đặt hệ thống trở lại bình thường mặc dù tôi không hoàn toàn chắc chắn về những gì FOREIGN_KEY_CHECKS thực hiện. Hi vọng điêu nay co ich!


Đây không phải chỉ là những gì đã được gợi ý trong câu trả lời được đăng bởi @ Mr-Faizan? Nếu không, vui lòng giải thích những gì câu trả lời của bạn bổ sung.
Adrian Mole

2

Điều này có thể được khắc phục bằng cách chèn các bản ghi tương ứng trong bảng Cha trước và sau đó chúng ta có thể chèn các bản ghi trong cột tương ứng của bảng Con. Đồng thời kiểm tra kiểu dữ liệu và kích thước của cột. Nó phải giống với cột của bảng mẹ, ngay cả engine và collation cũng phải giống nhau. THỬ CÁI NÀY! Đây là cách tôi giải quyết vấn đề của mình. Sửa cho tôi nếu sai.


1

ORDRELINJEBảng của bạn được liên kết với ORDERbảng bằng cách sử dụng một ràng buộc khóa ngoại constraint Ordrelinje_fk foreign key(Ordre) references Ordre(OrdreID)theo đó Ordre int NOT NULL,cột của bảng ORDRELINJEphải khớp với bất kỳ Ordre int NOT NULL,cột nào của ORDERbảng.

Bây giờ những gì đang xảy ra ở đây là, khi bạn đang chèn hàng mới vào ORDRELINJEbảng, theo ràng buộc fk, Ordrelinje_fknó đang kiểm tra ORDERbảng xem OrdreIDcó hiện diện hay không và vì nó không khớp với bất kỳ OrderId nào, Trình biên dịch đang khiếu nại vì vi phạm khóa ngoại. Đây là lý do bạn nhận được lỗi này.

Khóa ngoại là khóa chính của bảng khác mà bạn sử dụng trong bất kỳ bảng nào để liên kết giữa cả hai. Khóa này bị ràng buộc bởi ràng buộc khóa ngoại mà bạn chỉ định trong khi tạo bảng. Mọi thao tác trên dữ liệu không được vi phạm ràng buộc này. Vi phạm ràng buộc này có thể dẫn đến các lỗi như thế này.

Hy vọng tôi đã làm cho nó rõ ràng.


1

Trong khi chèn các giá trị thuộc tính khóa ngoại, trước tiên hãy xác minh loại thuộc tính, cũng như giá trị thuộc tính khóa chính trong quan hệ mẹ, nếu các giá trị trong quan hệ mẹ khớp, thì bạn có thể dễ dàng chèn / cập nhật các giá trị thuộc tính con.


1

bạn nên thêm dữ liệu từ KHÓA TÀI LIỆU THAM KHẢO trong BẢNG CHÍNH XÁC thành TỪ KHÓA NGOẠI TỆ trong BẢNG CON,
điều đó có nghĩa là không thêm dữ liệu ngẫu nhiên vào khóa ngoại ، chỉ sử dụng dữ liệu từ khóa chính có thể truy cập được

mô tả dữ liệu trong khóa ngoại


1

Điều này đã giúp tôi hiểu ra sau khi đọc @ Mr-Faizan's và các câu trả lời khác.

Bỏ chọn 'Bật kiểm tra khóa ngoại'

trong phpMyAdmin và nhấn truy vấn. Tôi không biết về WorkBench nhưng các câu trả lời khác có thể giúp bạn.


0

bạn nên chèn ít nhất một nguyên trong mỗi bảng (những bảng mà bạn muốn khóa ngoại trỏ vào) sau đó bạn có thể chèn hoặc cập nhật giá trị của khóa ngoại


0

tôi không thể nhấn mạnh điều này ở đây: trường hợp của tôi là cố gắng tạo lượt thích cho một bài đăng không tồn tại; trong khi cam kết với cơ sở dữ liệu, lỗi đã được nâng lên. giải pháp đầu tiên là tạo bài đăng sau đó thích nó. Theo hiểu biết của tôi nếu post_id được lưu trong bảng thích thì trước tiên nó phải kiểm tra với bảng bài đăng để xác định sự tồn tại. tôi thấy tốt hơn là nên để nó theo cách này vì nó hợp lý hơn với tôi theo cách đó ..


0

Khi bạn đang sử dụng khóa ngoại , thứ tự các cột của bạn phải giống nhau để chèn .

Ví dụ, nếu bạn đang thêm (userid, password)trong table1 từ table2 sau đó từ table2 để nên giống nhau (userid, password)không giống như (password,userid) nơi useridkhóa ngoại trong table2 của table1 .


0

Sự cố xảy ra do bạn đặt khóa ngoại trong bảng con sau khi bạn chèn một số dữ liệu vào bảng con.

Hãy thử xóa tất cả dữ liệu khỏi bảng con, sau đó đặt khóa ngoại và sau đó thêm / chèn dữ liệu vào bảng, nó sẽ hoạt động.


0

kiểm tra không. của bản ghi trong bảng mẹ khớp với bảng con và khóa chính cũng phải khớp với tham chiếu khóa ngoại. Điều này làm việc cho tôi.


-4

100% của nó hoạt động ...

LỖI 1452: Không thể thêm hoặc cập nhật hàng con: ràng buộc khóa ngoại không thành công .... nếu loại lỗi này xảy ra: thì Trước hết hãy truy cập bảng này và kiểm tra cài đặt> nếu Engine là: InnoDB thì thay đổi nó thành MyISAM

(và xóa tham chiếu ràng buộc nước ngoài)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.