Lỗi MySQL 1215: Không thể thêm ràng buộc khóa ngoại

Tôi đang nỗ lực chuyển tiếp kỹ thuật lược đồ mới của mình lên máy chủ db của mình, nhưng tôi không thể tìm thấy nguyên nhân vì sao tôi gặp lỗi này. Tôi đã nỗ lực tìm kiếm câu giải đáp ở giai đoạn này, nhưng mọi thứ tôi tìm ra đều cho biết đặt dụng cụ db thành Innodb hoặc để bảo đảm các khóa tôi đang nỗ lực sử dụng làm khóa ngoại là khóa chính trong bảng của riêng chúng . Tôi đã làm được cả hai điều này, nếu tôi không nhầm. Bất kỳ sự trợ giúp nào khác mà các bạn có thể phân phối?

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 

Thực thi tập lệnh SQL đã hoàn tất: câu lệnh: 7 thành công, 1 không thành công

Đây là SQL cho các bảng cha.

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 Vui lòng đăng lược đồ cho các bảng mẹ: Clients & Staff.
  • có thể trùng lặp lỗi MySQL không thể thêm ràng buộc khóa ngoại
  • 1 @Denis nó có thể không phải là một bản sao vì OP cho biết họ đã kiểm tra rằng các cột là PK trong bảng cha.
  • Tôi đã thêm các câu lệnh SQL cho bảng KH & Nhân sự theo yêu cầu.
  • Có thể có bản sao của MySQL Không thể thêm ràng buộc khóa ngoại

Tôi đoán điều đó Clients.Case_Number & / hoặc Staff.Emp_ID không chuẩn xác cùng kiểu dữ liệu với Clients_has_Staff.Clients_Case_Number & Clients_has_Staff.Staff_Emp_ID.

Có vẻ các cột trong bảng mẹ là INT UNSIGNED?

Chúng cần có cùng một kiểu dữ liệu trong cả hai bảng.

  • 11 Cảm ơn. Điều này hóa ra là vấn đề. Staff.Emp_ID là một SMALLINT, trong lúc cột tham chiếu là INT. Đôi lúc này là những điều nhỏ nhặt …
  • Tks. Trong trường hợp của tôi, tôi đã vô tình nhấn vào “ZeroFill” trên khóa ngoại trong bảng con, điều đó có nghĩa là nó không khớp chuẩn xác với cột của bảng mẹ.
  • 12 Cũng có thể là do bộ ký tự khác nhau. Tôi khắc phục vấn đề này trong đó một cột có ký tự utf8 được đặt trong lúc cột kia có latin1. Đơn giản sửa chữa bằng ALTER TABLE Table BỘ NHÂN VẬT = utf8; & BẢNG ALTER Device THAY ĐỔI CỘT ID ID CHAR (36) BỘ NHÂN VẬT ‘utf8’ KHÔNG ĐỦ;
  • 3 @ www.jensolsson.se Bạn đã đúng, nếu PK bao gồm một hoặc nhiều cột chuỗi thì chúng phải sử dụng cùng một bộ ký tự đối chiếu. Trong trường hợp cụ thể này, PK là một INT nên bộ ký tự của bảng & / hoặc cột không liên quan.
  • 2 Đối chiếu là vấn đề của tôi, latin1 vs utf8 (kiểm soát bảng VÀ cột).

Những nguyên nhân bạn có thể gặp lỗi ràng buộc khóa ngoại:

  1. Bạn không sử dụng InnoDB làm dụng cụ trên toàn bộ các bảng.
  2. Bạn đang nỗ lực tham chiếu một khóa không tồn tại trên bảng đích. Hãy chắc nịch rằng nó là một Chìa khóa trên bảng khác (nó có thể là khóa chính hoặc khóa duy nhất, hoặc chỉ key)
  3. Kiểu của các cột không giống nhau (ngoại lệ là cột trên bảng tham chiếu có thể là giá trị rỗng ngay cả khi nó không thể null trên bảng được tham chiếu).
  4. Nếu PK / FK là một varchar, hãy bảo đảm rằng đối chiếu là giống nhau cho cả hai.

Update:

  1. Một trong những nguyên nhân cũng có thể là cột bạn đang sử dụng ON DELETE SET NULL không được khái niệm là null. Chính vì như vậy, hãy bảo đảm rằng cột được đặt mặc định là null.

Kiểm soát những điều này.

  • 14 Tôi chỉ nói thêm rằng nếu FK nằm trên một cột ký tự, tôi nghĩ chúng cần có cùng một bộ ký tự & đối chiếu. (Hoặc có thể các bảng mã 1 byte & 2 byte không tương thích.)
  • 6 Nguyên nhân của tôi là bạn đã nêu ra câu trước tiên “Các công cụ DB khác nhau cho hai bảng, InnoDB và MyISAM”
  • 7 Tôi có một nguyên nhân khác =) “ “ ON DELETE CASCADE ON UPDATE SET NULL: ” ‘Bạn đã xác nhận điều kiện SET NULL mặc dầu một số cột được khái niệm là NOT NULL. Chính vì như vậy, tôi chỉ sửa khái niệm FK.
  • 1 Cũng có thể thất bại là không có chỉ mục trên trường mục tiêu.
  • Tốt, điểm thứ 4 là vấn đề của tôi. Nó hơi khó chịu – nhưng tôi rất vui vì mysql đã sụp đổ vì điều đó

So với những người khác, lỗi tương đương có thể không phải bao giờ cũng do loại cột không khớp, bạn có thể khám phá thêm thông tin về lỗi khóa mysql foriegn bằng cách sai bảo

SHOW ENGINE INNODB STATUS; 

bạn có thể tìm ra lỗi ở gần đầu thư đã in, giống như

Không thể tìm ra chỉ mục trong bảng được tham chiếu nơi các cột được tham chiếu hiện ra dưới dạng cột trước tiên hoặc loại cột trong bảng & bảng được tham chiếu không khớp với ràng buộc.

  • 13 Đây là câu giải đáp tốt nhất mà tôi nghĩ vì nó giúp ích trong việc chẩn đoán! Cảm ơn.
  • Làm thế nào mà nên làm việc? Thực hiện cả hai truy vấn liên tiếp?
  • @ C4u, vâng, tất cả chúng ta nên thực hiện cả hai truy vấn liên tiếp bằng cách hiển thị TRẠNG THÁI ĐỘNG CƠ INNODB như trước tiên & sau này là các truy vấn khác
  • 1 Làm điều đó trên PHPMyAdmin sẽ không hoạt động. làm điều đó trên dấu nhắc lệnh.
Xem Thêm  Truy vấn SQL sử dụng mệnh đề COUNT và HAVING - có đếm 1 sql

Lỗi 1215 là một lỗi khó chịu. Câu giải đáp của Explosion Pill bao gồm những điều căn bản. Bạn mong muốn bảo đảm xuất phát từ đó. Ngoài ra, có nhiều trường hợp cầu kỳ hơn cần Note:

Chẳng hạn: khi bạn nỗ lực link các KHÓA CHÍNH của các bảng khác nhau, hãy bảo đảm phân phối ON UPDATE & ON DELETE các tùy chọn. Chẳng hạn.:

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

sẽ không cất cánh, vì CÁC KHÓA CHÍNH (ví dụ như id) không được NULL.

Tôi chắc nịch rằng, thậm chí còn tồn tại nhiều vấn đề cầu kỳ tương đương khi thêm các loại ràng buộc này, này là nguyên nhân vì sao khi gặp lỗi ràng buộc, hãy luôn bảo đảm rằng các ràng buộc & ẩn ý của chúng có ý nghĩa trong cục diện bây giờ của các bạn. Chúc may mắn với lỗi 1215 của các bạn!

  • 1 Bạn cũng sẽ gặp lỗi này nếu bạn nỗ lực xóa khóa ngoại không có ở đó 🙂
  • 2 không dừng lại ở đó, từ ebook: MySQL yêu cầu chỉ mục trên các khóa ngoại & khóa tham chiếu để việc kiểm soát khóa ngoại có thể mau lẹ & không yêu cầu quét bảng. Trong bảng tham chiếu, cần phải có một chỉ mục trong đó các cột khóa ngoại được liệt kê là các cột trước tiên . Chỉ mục như thế được tạo auto trên bảng tham chiếu nếu nó không tồn tại. Chỉ mục này có thể bị loại bỏ một cách lặng lẽ sau đó, nếu bạn tạo một chỉ mục khác có thể được sử dụng để thực thi ràng buộc khóa ngoại. index_name, nếu được phân phối, được sử dụng như đã miêu tả trước đây.
  • 1 Này là nguyên nhân tôi đến đây: Tôi đã nỗ lực tạo khóa ngoại ON DELETE SET NULL trên một cột mà tôi mong muốn trở thành NOT NULL. Giả sử bạn không thể cầm chiếc bánh của mình & ăn nó.

Kiểm soát đối chiếu của bảng, sử dụng SHOW TABLE STATUS bạn có thể kiểm soát thông tin về các bảng, bao gồm cả đối chiếu.

Cả hai bảng cần phải có cùng một đối chiếu.

Nó đã xảy ra với tôi.

  • Đây là vấn đề trong trường hợp của tôi – lỗi MySQL không hữu dụng chút nào!

Trong trường hợp của tôi, tôi đã xóa một bảng bằng cách dùng SET FOREIGN_KEY_CHECKS=0, sau đó SET FOREIGN_KEY_CHECKS=1 sau. Khi tôi tải lại bảng, tôi đã error 1215. Vấn đề là có một bảng khác trong CSDL có khóa ngoại cho bảng mà tôi đã xóa & đang tải lại. Một phần của tiến trình tải lại liên quan tới việc biến đổi kiểu dữ liệu cho một trong các trường, điều này khiến cho khóa ngoại từ bảng kia không hợp lệ, thành ra kích hoạt error 1215. Tôi đã khắc phục sự cố bằng cách thả & sau đó tải lại bảng khác với kiểu dữ liệu mới cho trường liên quan.

Tôi gặp lỗi tương đương khi nỗ lực thêm fk. Trong trường hợp của tôi, vấn đề là do PK của bảng FK được đánh dấu là không có dấu.

Có một lỗi mà tôi đã gặp phải với “Lỗi 1215: Không thể thêm ràng buộc khóa ngoại” khi sử dụng Laravel 4, nhất là với Bộ tạo Laravel 4 của JeffreyWay.

Trong Laravel 4, bạn có thể sử dụng Trình tạo của JeffreyWay để tạo các tệp di chuyển để tạo từng bảng một, có nghĩa là mỗi tệp di chuyển tạo thành một bảng. Bạn phải biết thực tiễn là mỗi tệp di chuyển được tạo với một dấu thời gian trong tên tệp, dấu thời gian này phân phối cho các tệp một thứ tự. Thứ tự thế hệ cũng là thứ tự của thao tác di chuyển khi bạn kích hoạt lệnh Artisan CLI “php Artian di cư”. Chính vì như vậy, nếu một tệp yêu cầu ràng buộc khóa ngoại tham chiếu đến khóa sẽ được, nhưng chưa được tạo trong tệp sau, thì Lỗi 1215 được kích hoạt. Trong trường hợp này, những gì bạn phải làm là bố trí thứ tự tạo tệp di chuyển. Tạo tệp mới theo thứ tự phù hợp, copy bài viết, sau đó xóa các tệp cũ bị đảo lộn.

tôi đã gặp vấn đề tương đương, biện pháp của tôi:

Trước:

CREATE TABLE EMPRES ( NoFilm smallint NOT NULL PRIMARY KEY (NoFilm) FOREIGN KEY (NoFilm) REFERENCES cassettes ); 

Bí quyết:

CREATE TABLE EMPRES (NoFilm smallint NOT NULL REFERENCES cassettes, PRIMARY KEY (NoFilm) ); 

Tôi mong ước nó sẽ giúp;)

  • 1 Bạn đã quên một vài dấu phẩy trong CREATE trước tiên của mình

Tôi đã từng gặp vấn đề tương đương.
Tôi đã khắc phục nó bằng phương pháp này:

Tôi đã tạo dòng sau trong
primary key: (id int(11) unsigned NOT NULL AUTO_INCREMENT)

Tôi đã tìm thấy biện pháp này sau thời điểm nỗ lực nhập một bảng trong trình tạo giản đồ của mình. Nếu nó phù phù hợp với bạn, hãy cho tôi biết!

Chúc may mắn!

Felipe T rcio

Tôi chỉ mong muốn thêm trường hợp này cho VARCHAR quan hệ khóa ngoại. Tôi đã dành tuần trước để nỗ lực tìm thấy điều này trong MySQL Workbench 8.0 & cuối cùng đã có thể fix lỗi.

Câu giải đáp ngắn: Bộ ký tự & đối chiếu của lược đồ, bảng, cột, bảng tham chiếu, cột tham chiếu & bất kỳ bảng nào khác tham chiếu đến bảng mẹ phải khớp với nhau.

Câu giải đáp dài: Tôi có một kiểu dữ liệu ENUM trong bảng của mình. Tôi đã biến đổi cái này thành VARCHAR & tôi có thể lấy các giá trị từ bảng tham chiếu để không phải biến đổi bảng mẹ để thêm các tùy chọn bổ sung. Mối quan hệ khóa ngoại này có lẽ dễ dàng nhưng tôi mắc lỗi 1215. câu giải đáp của arvind & link sau đã đề nghị việc sử dụng

SHOW ENGINE INNODB STATUS; 

Khi sử dụng lệnh này, tôi thu được miêu tả cụ thể sau về lỗi mà không có thông tin hữu dụng bổ sung

Không thể tìm ra chỉ mục trong bảng được tham chiếu nơi các cột được tham chiếu hiện ra dưới dạng cột trước tiên hoặc loại cột trong bảng & bảng được tham chiếu không khớp với ràng buộc. Note rằng kiểu lưu trữ nội bộ của ENUM & SET đã biến đổi trong các bảng được tạo bằngvàgt; = InnoDB-4.1.12 & các cột như thế trong bảng cũ không thể được các cột như thế trong bảng mới tham chiếu. Vui lòng đọc qua http://dev.mysql.com/doc/refman/8.0/en/innodb-foreign-key-constraints.html để biết khái niệm khóa ngoại chuẩn xác.

Sau đó tôi đã sử dụng SET FOREIGN_KEY_CHECKS=0; theo đề nghị của Arvind Bharadwaj & link ở giai đoạn này:

Xem Thêm  Cách sử dụng phông chữ Google trong CSS? - sử dụng phông chữ google trong css

Điều này đã đề ra cảnh báo lỗi sau:

Mã lỗi: 1822. Không thêm được ràng buộc khóa ngoại. Thiếu chỉ mục cho ràng buộc

Tại thời điểm này, tôi đã ‘kiến trúc ngược’ lược đồ & tôi đã có thể tạo mối quan hệ khóa ngoại trong biểu đồ EER. Khi sử dụng ‘kỹ sư chuyển tiếp’, tôi gặp lỗi sau:

Lỗi 1452: Không thể thêm hoặc update hàng con: ràng buộc khóa ngoại không thành công

Khi tôi ‘chuyển tiếp kỹ sư’ căn chỉnh sơ đồ EER sang một lược đồ mới, tập lệnh SQL chạy mà không có vấn đề gì. Khi so sánh SQL được tạo từ các phấn đấu chuyển tiếp kỹ sư, tôi thấy rằng sự độc đáo là bộ ký tự & đối chiếu. Bảng cha, bảng con & hai cột có utf8mb4 bộ ký tự & utf8mb4_0900_ai_ci đối chiếu, bên cạnh đó, một cột khác trong bảng mẹ đã được tham chiếu bằng cách dùng CHARACTER SET = utf8 , COLLATE = utf8_bin ; sang một bảng con khác.

So với toàn thể lược đồ, tôi đã biến đổi bộ ký tự & đối chiếu cho toàn bộ các bảng & toàn bộ các cột thành như sau:

CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci; 

Điều này cuối cùng đã đáp ứng được vấn đề của tôi với lỗi 1215.

Note bên: Sự đối chiếu utf8mb4_general_ci hoạt động trong MySQL Workbench 5.0 trở lên. Đối chiếu utf8mb4_0900_ai_ci chỉ hoạt động cho MySQL Workbench 8.0 trở lên. Tôi tin rằng một trong những nguyên nhân khiến tôi gặp vấn đề với bộ ký tự & đối chiếu là do bản cải tiến MySQL Workbench lên 8.0 ở giữa. Đây là một link nói thêm về sự đối chiếu này.

Tôi không thể tìm ra lỗi này

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 ) 

Điều này cũng xảy ra khi kiểu của các cột không giống nhau.

chẳng hạn. nếu cột bạn đang tham chiếu là UNSIGNED INT & cột đang được tham chiếu là INT thì bạn gặp lỗi này.

So với MySQL (INNODB) … lấy khái niệm cho các cột bạn mong muốn link

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

so sánh & kiểm tra cả hai khái niệm cột có

cùng COLUMN_TYPE (bề dài), cùng COLATION

có thể hữu dụng để chơi như

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; 

Kiểm soát tính tương thích của bảng. Chẳng hạn: nếu một bảng MyISAM & cái kia là InnoDB, bạn có thể có vấn đề này.

Một nguyên nhân khác: nếu bạn sử dụng ON DELETE SET NULL toàn bộ các cột được sử dụng trong khóa ngoại phải cho phép giá trị rỗng. Ai đó đã tìm thấy điều này trong thắc mắc này.

Theo hiểu biết của tôi, nó sẽ không có vấn đề gì liên quan đến tính vẹn toàn của dữ liệu, nhưng có lẽ như MySQL không trợ giúp chức năng này (trong 5.7).

Khi lỗi này xảy ra do bảng được tham chiếu sử dụng dụng cụ MyISAM, câu giải đáp này phân phối một cách mau lẹ để chuyển hóa CSDL của các bạn để toàn bộ các bảng mô hình Django sử dụng InnoDB: https://stackoverflow.com/a/15389961/2950621

Này là một lệnh làm chủ Django được gọi là convert_to_innodb.

Wooo, tôi vừa có nó! Này là sự phối hợp của rất là nhiều câu giải đáp đã được đăng (innoDB, không dấu, v.v.). Một điều tôi không thấy ở giai đoạn này là: nếu FK của các bạn đang trỏ trên PK, hãy bảo đảm cột nguồn có giá trị thích hợp. Chẳng hạn: nếu PK là một phương tiện (8), hãy bảo đảm rằng cột nguồn cũng chứa một phương tiện (8). Này là một phần của vấn đề so với tôi.

So với tôi, này là các loại cột. BigINT! = INT.

Nhưng sau đó nó vẫn không hoạt động.

Chính vì như vậy, tôi đã kiểm soát động cơ. Bảo đảm Table1 = InnoDB & Table = InnoDB

Tôi gặp phải lỗi này vì một nguyên nhân hoàn toàn khác. Tôi đã sử dụng MySQL Workbench 6.3 để tạo Mô hình dữ liệu của mình (dụng cụ tuyệt vời). Tôi nhận biết rằng khi thứ tự cột được xác nhận trong khái niệm ràng buộc Khoá ngoại không phù phù hợp với trình tự cột của bảng, lỗi này cũng được tạo thành.

Tôi đã mất khoảng 4 giờ để thử mọi thứ khác nhưng kiểm soát điều đó.

Lúc này toàn bộ đều hoạt động tốt & tôi có thể quay lại với việc viết mã. 🙂

  • Ý bạn là như vậy nào?
  • 2 @YazanJaber Tôi nghĩ ý của anh ấy là: InnoDB cho phép một khóa ngoại tham chiếu đến bất kỳ cột chỉ mục hoặc nhóm cột nào. Ngoài ra, trong bảng được tham chiếu, cần phải có một chỉ mục trong đó các cột được tham chiếu được liệt kê là các cột trước tiên theo cùng một thứ tự.
Xem Thêm  Nút tắt JavaScript - nút tắt trong javascript

khi cố tạo khóa ngoại khi sử dụng di chuyển laravel

như chẳng hạn này:

bảng người dùng

 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(); }); } 

bảng màu

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

thỉnh thoảng tài sản không hoạt động

[PDOExceptionvàamp;rsqb; SQLSTATEvàamp;lsqb;HY000vàamp;rsqb;: General error: 1215 Cannot add foreign key constraint 

lỗi này đã xảy ra do khóa ngoại (loại) trong [bảng người dùngvàamp;rsqb; khác với khóa chính (loại) trong [bảng màuvàamp;rsqb;

Để khắc phục vấn đề này, nên biến đổi khóa chính trong [bảng màuvàamp;rsqb;

$table->tinyIncrements('id');

Khi bạn sử dụng khóa chính $table->Increments('id');

chúng ta nên sử dụng Integer như một khóa ngoại

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

Khi bạn sử dụng khóa chính $table->tinyIncrements('id');

chúng ta nên sử dụng unsignedTinyInteger như một khóa ngoại

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

Khi bạn sử dụng khóa chính $table->smallIncrements('id');

chúng ta nên sử dụng unsignedSmallInteger như một khóa ngoại

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

Khi bạn sử dụng khóa chính $table->mediumIncrements('id');

chúng ta nên sử dụng unsignedMediumInteger như một khóa ngoại

 $table-> unsignedMediumInteger('fk_id'); $table->foreign('fk_id')->references('id')->on('table_name'); 
  • Điều này giúp tôi. Tôi đã có bigIncrements làm khóa chính, chính vì vậy tôi bắt buộc phải sử dụng unsignedBigInteger

Trong trường hợp của tôi, tôi đã phải tắt FOREIGN KEY kiểm soát vì bảng nguồn không tồn tại.

SET FOREIGN_KEY_CHECKS=0;

Hãy Note về việc sử dụng các trích dẫn ngược. Tôi đã có trong một cốt chuyện câu lệnh sau

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

nhưng các dấu ngoặc kép ở cuối là sai. Đáng đáng ra nó phải là:

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

MySQL không phân phối thông tin cụ thể về lỗi này …

Một lý do khác của lỗi đó là bạn có 2 hoặc nhiều tên bảng giống nhau có cùng tên khóa ngoại. Điều này thỉnh thoảng xảy ra với những người tiêu dùng PM kiến trúc & mô hình hóa, như Mysql Workbench & sau đó tạo tập lệnh từ kiến trúc.

Tôi biết mình RẤT muộn đến buổi tiệc nhưng tôi mong muốn mang nó ra đây để nó được liệt kê.

Cũng như toàn bộ các khuyến cáo ở trên để bảo đảm rằng các trường được xác nhận giống hệt nhau & các loại bảng cũng có cùng một đối chiếu, hãy bảo đảm rằng bạn không mắc phải lỗi lầm mới khi nỗ lực link các trường mà dữ liệu trong trường CHILD không phải là. đã có trong trường PHỤ HUYNH. Nếu bạn có dữ liệu trong trường CON mà bạn chưa nhập vào trường PHỤ HUYNH thì điều đó sẽ gây ra lỗi này. Thật tiếc khi cảnh báo lỗi không hữu dụng hơn một tí.

Nếu bạn không chắc nịch, hãy sao lưu bảng có Khóa ngoại, xóa toàn bộ dữ liệu & sau đó thử tạo Khóa ngoại. Nếu thành công thì bạn phải làm gì!

Chúc may mắn.

Đây là một phiên bản tinh tế của những gì đã được nói, nhưng trong trường hợp của tôi, tôi có 2 CSDL (foo & bar). Tôi đã tạo foo trước & tôi không nhận biết rằng nó tham chiếu đến khóa ngoại trong bar.baz (chưa được tạo). Khi tôi nỗ lực tạo bar.baz (không có bất kỳ khóa ngoại nào), tôi vẫn gặp lỗi này. Sau khoảng thời gian nhìn chung quanh một lúc, tôi tìm ra khóa ngoại trong foo.

Chính vì như vậy, mẩu chuyện ngắn, Nếu bạn gặp lỗi này, bạn có thể có một khóa ngoại tồn tại từ trước cho bảng đang được tạo.

So với tôi, lỗi 1215 xảy ra khi tôi nhập tệp kết xuất được tạo bởi mysqldump, tạo các bảng theo thứ tự bảng chữ cái, trong trường hợp của tôi, tạo thành các khóa ngoại cho các bảng tham chiếu được tạo sau này trong tệp. (Đạo cụ đến trang này để nêu ra nó: https://www.percona.com/blog/2017/04/06/dealing-mysql-error-code-1215-cannot-add-foreign-key-constraint/)

Vì mysqldump xếp đặt các bảng theo thứ tự bảng chữ cái & tôi không mong muốn biến đổi tên của các bảng, nên tôi đã học theo chỉ dẫn trong câu giải đáp của JeremyWeir trên trang này, trong đó có set FOREIGN_KEY_CHECKS = 0; ở đầu tệp kết xuất & đặt SET FOREIGN_KEY_CHECKS = 1; ở cuối tệp kết xuất.

Bí quyết đó đã làm việc cho tôi.

Chính vì như vậy, tôi đã thử toàn bộ các bản fix lỗi ở trên & không may mắn. Tôi có thể thiếu lỗi trong bảng của mình -chỉ không thể tìm thấy lý do & tôi tiếp tục gặp lỗi 1215. Chính vì như vậy, tôi đã sử dụng bản fix lỗi này.

Trong môi trường cục bộ của tôi trong phpMyAdmin, tôi đã xuất dữ liệu từ bảng được đề cập. Tôi đã chọn định dạng CSV. Trong lúc vẫn ở trong phpMyAdmin với bảng được chọn, tôi đã chọn “Thêm-> Tùy chọn”. Ở giai đoạn này tôi cuộn xuống “Sao chép bảng vào (database.table). Chọn” Chỉ kết cấu “. Đổi tên bảng nào đó, có thể chỉ cần thêm từ” copy “bên cạnh tên bảng hiện tại. Nhấp vào” Đi “. Thao tác này sẽ tạo mới bảng. Xuất bảng mới và nhập vào máy chủ mới hoặc máy chủ khác. Tôi cũng đang sử dụng phpMyAdmin ở đây. Sau khi nhập, hãy đổi tên của bảng trở lại tên ban đầu. Chọn bảng mới, chọn nhập. Đối với định dạng, hãy chọn CSV . Bỏ chọn “bật kiểm soát khóa ngoại”. Chọn “Khởi đầu”. Cho đến nay tất cả đều hoạt động tốt.

Tôi đã đăng sửa chữa của tôi trên blog của tôi.

Ngay cả tôi đã có cùng một vấn đề. Và lỗi là với điểm đánh dấu “không dấu” trong bảng PK của FK

Tôi đã có cùng một lỗi một lần. Tôi chỉ cần khởi động lại máy chủ MySQL & giải quyết sự cố.

  • Điều này không giải quyết được sự cố.

Backlinks

+ Plus

Send

Send

Pin

Viết một bình luận