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


334

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

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ác câu lệnh: 7 đã thành công, 1 thất bại

Đâ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 gửi lược đồ cho các bảng cha: ClientsStaff.
Ike Walker


1
@Denis có lẽ không phải là một bản sao vì OP nói rằng họ đã xác minh rằng các cột là PK trong các bảng cha.
Ike Walker

Tôi đã thêm các câu lệnh SQL cho các bảng Khách hàng và Nhân viên theo yêu cầu.
Robert B

Câu trả lời:


591

Tôi đoán rằng Clients.Case_Numbervà / hoặc Staff.Emp_IDkhông chính xác cùng loại dữ liệu Clients_has_Staff.Clients_Case_NumberClients_has_Staff.Staff_Emp_ID.

Có lẽ các cột trong bảng cha là INT UNSIGNED?

Chúng cần phải chính xác cùng một kiểu dữ liệu trong cả hai bảng.


10
Cảm ơn. Điều này hóa ra là vấn đề. Nhân viên.Emp_ID là một SMALLINT, trong khi cột tham chiếu là một INT. Đôi khi, đó là những điều nhỏ nhặt ...
Robert B

Tks. Trong trường hợp của tôi, tôi đã vô tình nhấp vào "ZeroFill" trên khóa ngoại trong bảng con, điều đó có nghĩa là nó không khớp chính xác với cột của bảng cha.
wwkudu

12
Nó cũng có thể là bộ ký tự là khác nhau. Tôi đã giải quyết vấn đề này trong đó một cột có bộ ký tự utf8 trong khi cột kia có latin1. Dễ dàng sửa với ALTER TABLE TableCHARACTER SET = utf8; và ALTER TABLE DeviceTHAY ĐỔI COLUMN ID IDCHAR (36) CHARACTER SET 'utf8' KHÔNG NULL;
www.jensolsson.se

3
@ www.jensolsson.se Bạn đã đúng, nếu PK bao gồm một hoặc nhiều cột chuỗi thì họ 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à INT nên bộ ký tự của bảng và / hoặc cột không liên quan.
Ike Walker

2
Đối chiếu là vấn đề của tôi, latin1 vs utf8 (kiểm tra bảng VÀ cột).
ben_979

244

Lý do 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 công cụ trên tất cả các bảng.
  2. Bạn đang cố gắng tham chiếu khóa không tồn tại trên bảng đích. Đảm bảo rằng đó là một khóa trên bảng khác (nó có thể là khóa chính hoặc khóa duy nhất)
  3. Các loại cột không giống nhau (ngoại lệ là cột trên bảng tham chiếu có thể là null).
  4. Nếu PK / FK là một varchar, hãy đảm bảo đối chiếu giống nhau cho cả hai.

Cập nhật:

  1. Một trong những lý do cũng có thể là cột bạn đang sử dụng ON DELETE SET NULLkhông được xác định là null. Vì vậy, hãy chắc chắn rằng cột được đặt mặc định là null.

Kiểm tra những cái này.


14
Tôi sẽ chỉ nói thêm rằng nếu FK nằm trên một cột ký tự, tôi nghĩ rằng chúng cần phải có cùng bộ ký tự và đối chiếu. (Hoặc có thể các bộ ký tự 1 byte và 2 byte không tương thích.)
Graham Charles

5
Lý do của tôi là bạn đã chỉ ra cái đầu tiên "Động cơ DB khác nhau cho hai bảng, InnoDB và MyISAM"
Randika Vishman

7
Tôi có một lý do khác =) `` `TRÊN XÓA CASCADE TRÊN CẬP NHẬT THIẾT LẬP NULL:` `` Bạn đã xác định một điều kiện SET NULL mặc dù một số cột được định nghĩa là KHÔNG NULL. Vì vậy, tôi chỉ sửa định nghĩa FK.
alexglue

1
Cũng có thể thất bại là không có chỉ số trên trường mục tiêu.
Paul T. Rawkeen

1
tốt đẹp, điểm thứ 4 là vấn đề của tôi Điều đó thật khó chịu - nhưng tôi rất vui vì mysql đã gặp sự cố vì điều đó
Sebas

85

Đối với những người khác, lỗi tương tự có thể không phải luôn luôn do lỗi không khớp kiểu cột, bạn có thể tìm hiểu thêm thông tin về lỗi khóa foriegn của mysql bằng cách ban hành lệnh

SHOW ENGINE INNODB STATUS;

bạn có thể tìm thấy một lỗi gần đầu tin nhắn được in

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


13
Đây là câu trả lời tốt nhất tôi nghĩ vì nó giúp chẩn đoán! Cảm ơn.
alexglue

Làm thế nào nên làm việc? Thực hiện cả hai truy vấn liên tiếp?
C4d 17/03/2016

@ C4u, vâng, chúng tôi nên thực hiện cả hai truy vấn liên tiếp bằng cách sử dụng SHOW Engine INNODB STATUS như trước và sau đó là các truy vấn khác
sureshd

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.
ruwan800

13

Lỗi 1215 là một lỗi khó chịu. Câu trả lời của thuốc nổ bao gồm những điều cơ bản. Bạn muốn chắc chắn để bắt đầu từ đó. Tuy nhiên, có nhiều trường hợp tinh vi hơn nhiều để tìm kiếm:

Ví dụ: khi bạn cố gắng liên kết các phím CHÍNH của các bảng khác nhau, hãy đảm bảo cung cấp các tùy chọn ON UPDATEON DELETEtùy chọn phù hợp . Ví dụ:

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

sẽ không bay, vì các phím CHÍNH (chẳng hạn id) không thể NULL.

Tôi chắc chắn, thậm chí còn có nhiều vấn đề tương tự, tinh tế tương tự khi thêm các loại ràng buộc này, đó là lý do tại sao khi gặp các lỗi ràng buộc, luôn đảm bảo rằng các ràng buộc và ý nghĩa của chúng có ý nghĩa trong bối cảnh hiện tại của bạn. Chúc may mắn với lỗi của bạn 1215!


1
Bạn cũng sẽ gặp lỗi này nếu bạn cố xóa khóa ngoại không có ở đó :)
Vụ nổ Pills

2
Ngoài ra, từ các tài liệu: MySQL yêu cầu lập chỉ mục trên khóa ngoại và khóa được tham chiếu để kiểm tra khóa ngoại có thể nhanh và không yêu cầu quét bảng. Trong bảng tham chiếu, 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 đầu tiên theo cùng một thứ tự . Một chỉ mục như vậy được tạo tự động trên bảng tham chiếu nếu nó không tồn tại. Chỉ mục này có thể được giảm âm thầm 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 cung cấp, được sử dụng như được mô tả trước đây.
Jonathan M

1
Đó là lý do tôi đến đây: Tôi đã cố gắng tạo một khóa ngoại ON DELETE SET NULLtrên một cột mà tôi muốn trở thành NOT NULL. Giả sử bạn không thể có bánh của bạn và ăn nó, quá.
Martin Hennings

8

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

Cả hai bảng phải có cùng đố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 ích chút nào!
Đánh bóng

7

Trong trường hợp của tôi, tôi đã xóa một bảng bằng cách sử dụng SET FOREIGN_KEY_CHECKS=0, sau đó SET FOREIGN_KEY_CHECKS=1. Khi tôi đi tải lại bảng, tôi đã nhận được error 1215. Vấn đề là có một bảng khác trong cơ sở dữ liệu có khóa ngoại đối với bảng tôi đã xóa và đang tải lại. Một phần của quá trình tải lại liên quan đến việc thay đổi loại dữ liệu cho một trong các trường, điều này làm cho khóa ngoại từ bảng khác không hợp lệ, do đó kích hoạt error 1215. Tôi đã giải quyết vấn đề bằng cách thả và sau đó tải lại bảng khác với kiểu dữ liệu mới cho trường liên quan.


5

Có một cạm bẫy 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, đặc biệt là với Máy phát điện 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 sẽ tạo một bảng. Bạn phải nhận thức được thực tế rằng mỗi tệp di chuyển được tạo bằng dấu thời gian trong tên tệp, sẽ cung cấp cho các tệp một thứ tự. Thứ tự tạo cũng là thứ tự của thao tác di chuyển khi bạn thực hiện lệnh Artisan CLI "php artisan di chuyển". Vì 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 tạo nhưng chưa được tạo trong tệp sau thì Lỗi 1215 sẽ được kích hoạt. Trong trường hợp như vậy, điều bạn phải làm là điều chỉnh thứ tự tạo tệp di chuyển. Tạo các tệp mới theo đúng thứ tự, sao chép nội dung, sau đó xóa các tệp cũ bị rối loạn.


4

Tôi đã gặp lỗi tương tự trong khi cố gắng thêm một fk. Trong trường hợp của tôi, sự cố xảy ra do PK của bảng FK được đánh dấu là không dấu.


3

tôi đã có cùng một vấn đề, giải pháp của tôi:

Trước:

CREATE TABLE EMPRES
( NoFilm smallint NOT NULL

  PRIMARY KEY (NoFilm)

  FOREIGN KEY (NoFilm) REFERENCES cassettes

);

Giải pháp:

CREATE TABLE EMPRES
(NoFilm smallint NOT NULL REFERENCES cassettes,

 PRIMARY KEY (NoFilm)

);

Tôi hy vọng nó có ích;)


1
Bạn đã quên một vài dấu phẩy trong TẠO đầu tiên của mình
DLight

3

Tôi đã từng gặp vấn đề tương tự.
Tôi đã giải quyết nó bằng cách này:

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

Tôi đã tìm ra giải pháp này sau khi cố gắng nhập một bảng trong trình xây dựng lược đồ của mình. Nếu nó làm việc cho bạn, cho tôi biết!

Chúc may mắn!

Felipe Tércio


3

Tôi chỉ muốn thêm trường hợp này cho VARCHARmối quan hệ khóa ngoại. Tôi đã dành tuần trước để cố gắng tìm ra điều này trong MySQL Workbench 8.0 và cuối cùng đã có thể sửa lỗi.

Trả lời ngắn: Bộ ký tự và đối chiếu của lược đồ, bảng, cột, bảng tham chiếu, cột tham chiếu và bất kỳ bảng nào khác tham chiếu đến bảng cha phải khớp.

Câu trả lời dài: Tôi đã có một kiểu dữ liệu ENUM trong bảng của mình. Tôi đã thay đổi điều này thành VARCHARvà tôi có thể lấy các giá trị từ một bảng tham chiếu để tôi không phải thay đổi bảng cha để thêm các tùy chọn bổ sung. Mối quan hệ khóa ngoại này có vẻ đơn giản nhưng tôi đã gặp lỗi 1215. câu trả lời của arvindliên kết sau đây đề nghị sử dụng

SHOW ENGINE INNODB STATUS;

Khi sử dụng lệnh này, tôi đã nhận được mô tả dài dòng sau đây cho lỗi không có thêm thông tin hữu ích

Không thể tìm thấy một chỉ mục trong bảng được tham chiếu trong đó các cột được tham chiếu xuất hiện dưới dạng các cột đầu tiên hoặc các loại cột trong bảng và bảng được tham chiếu không khớp với ràng buộc. Lưu ý rằng loại lưu trữ nội bộ của ENUM và SET đã thay đổi trong các bảng được tạo bằng> = InnoDB-4.1.12 và các cột như vậy trong các bảng cũ không thể được tham chiếu bởi các cột như vậy trong các bảng mới. Vui lòng tham khảo http://dev.mysql.com/doc/refman/8.0/en/innodb-forign-key-constraint.html để biết định nghĩa khóa ngoại chính xác.

Sau đó tôi đã sử dụng SET FOREIGN_KEY_CHECKS=0;theo đề xuất của Arvind Bharadwaj và liên kết ở đây :

Điều này đã đưa ra thông báo lỗi sau:

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

Tại thời điểm này, tôi 'kỹ sư đảo ngược' lược đồ và tôi đã có thể tạo mối quan hệ khóa ngoài trong sơ đồ EER. Trên 'kỹ sư chuyển tiếp', tôi đã gặp lỗi sau:

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

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

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

CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

Điều này cuối cùng đã giải quyết vấn đề của tôi với lỗi 1215.

Lưu ý bên lề: Đối chiếu utf8mb4_general_cihoạt động trong MySQL Workbench 5.0 trở lên. Collation utf8mb4_0900_ai_cihoạt động chỉ dành cho MySQL Workbench 8.0 trở lên. Tôi tin rằng một trong những lý do khiến tôi gặp sự cố với bộ ký tự và đối chiếu là do nâng cấp MySQL Workbench lên 8.0 ở giữa. Đây là một liên kết nói nhiều hơn về đối chiếu này.


2

Tôi không thể tìm thấy 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
)

2

Điều này cũng xảy ra khi loại cột không giống nhau.

ví dụ: nếu cột bạn đang đề cập là INTSIGNED INT và cột được giới thiệu là INT thì bạn sẽ gặp lỗi này.


2

Đối với MySQL (INNODB) ... hãy lấy định nghĩa cho các cột bạn muốn liên kết

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 và xác minh cả hai định nghĩa cột có

cùng COLUMN_TYPE (chiều dài), cùng màu

có thể hữu ích để 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;

2

Kiểm tra tính tương thích của bảng. Ví dụ: nếu một bảng là MyISAMvà một bảng khác InnoDB, bạn có thể gặp vấn đề này.


2

Một lý do khác: nếu bạn sử dụng ON DELETE SET NULL tất cả các cột được sử dụng trong khóa ngoại phải cho phép giá trị null. Một số người khác tìm thấy điều này trong câu hỏi này .

Theo hiểu biết của tôi, đó sẽ không phải là vấn đề liên quan đến tính toàn vẹn dữ liệu, nhưng có vẻ như MySQL chỉ không hỗ trợ tính năng này (trong 5.7).


1

Khi xảy ra lỗi này vì bảng được tham chiếu sử dụng công cụ MyISAM, câu trả lời này cung cấp một cách nhanh chóng để chuyển đổi cơ sở dữ liệu của bạn để tất cả các bảng mô hình Django sử dụng InnoDB: https://stackoverflow.com/a/15389961/2950621

Đó là lệnh quản lý Django có tên convert_to_innodb.


1

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


1

Đối với tôi đó là các loại cột. BigINT! = INT.

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

Vì vậy, tôi đã kiểm tra các động cơ. Đảm bảo Table1 = InnoDB và Table = InnoDB


1

Tôi gặp lỗi này vì một lý do 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 (công cụ tuyệt vời). Tôi nhận thấy rằng khi thứ tự cột được xác định trong định nghĩa ràng buộc Khóa ngoài không khớp với trình tự cột của bảng, lỗi này cũng được tạo ra.

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

Bây giờ tất cả đang hoạt động tốt và tôi có thể quay lại mã hóa. :-)


Ý bạn là như thế nào?
Yazan Jaber

2
@YazanJaber tôi nghĩ anh ấy có nghĩa này : InnoDB cho phép một chính nước ngoài để tham khảo bất kỳ cột chỉ mục hoặc nhóm các cột. Tuy nhiên, trong bảng được tham chiếu, 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 đầu tiên theo cùng một thứ tự.
robsch

1

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

như ví dụ 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();
    });
}

đôi khi tài sản không hoạt động

[PDOException]
SQLSTATE[HY000]: 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ùng] bị lệch so với khóa chính (loại) trong [bảng màu]

Để giải quyết vấn đề này, nên thay đổi khóa chính trong [bảng màu]

$table->tinyIncrements('id');


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

bạn nên sử dụng Integernhư 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');

bạn nên sử dụng unsignedTinyIntegernhư 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');

bạn nên sử dụng unsignedSmallIntegernhư 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');

bạn nên sử dụng unsignedMediumIntegernhư 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ó bigIncrementskhóa chính, vì vậy tôi bắt buộc phải sử dụngunsignedBigInteger
jagad89

1

Trong trường hợp của tôi, tôi đã phải vô hiệu hóa FOREIGN KEYkiểm tra vì các bảng nguồn không tồn tại.

SET FOREIGN_KEY_CHECKS=0;


0

Hãy nhận biết việc sử dụng backquote quá. Tôi đã có trong một kịch bản tuyên bố sau đây

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

nhưng các backquote ở cuối là sai. Đáng lẽ ra phải là:

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

MySQL không may không có thông tin chi tiết về lỗi này ...


0

Một nguồn khác của lỗi này 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 đôi khi xảy ra với những người sử dụng phần mềm mô hình hóa và thiết kế, như Mysql Workbench, và sau đó tạo tập lệnh từ thiết kế.


0

Tôi biết tôi RẤT muộn bữa tiệc nhưng tôi muốn đưa nó ra đây để nó được liệt kê.

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

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

Chúc may mắn.


0

Đâ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 cơ sở dữ liệu (foo và bar). Tôi đã tạo foo trước và tôi không nhận ra nó đã tham chiếu khóa ngoại trong bar.baz (chưa được tạo). Khi tôi cố gắng tạo bar.baz (không có bất kỳ khóa ngoại nào), tôi tiếp tục gặp lỗi này. Sau khi nhìn xung quanh một lúc tôi tìm thấy khóa ngoại trong foo.

Vì vậy, câu chuyện dài ngắn, Nếu bạn gặp lỗi này, bạn có thể có một khóa ngoại có sẵn cho bảng được tạo.


0

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

Vì mysqldump sắp xếp các bảng theo thứ tự bảng chữ cái và tôi không muốn thay đổi tên của các bảng, tôi đã làm theo hướng dẫn trong câu trả lời của Jeremyweir trên trang này , trong đó nêu set FOREIGN_KEY_CHECKS = 0;ở đầu tệp kết xuất và đặtSET FOREIGN_KEY_CHECKS = 1; ở dưới cùng của tệp kết xuất .

Giải pháp đó đã làm việc cho tôi.


0

Vì vậy, tôi đã thử tất cả các bản sửa lỗi ở trên và không có may mắn. Tôi có thể thiếu lỗi trong các bảng của mình - không thể tìm ra nguyên nhân và tôi tiếp tục gặp lỗi 1215. Vì vậy, tôi đã sử dụng bản sửa 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 khi vẫn ở phpMyAdmin với bảng đã chọn, tôi đã chọn "Khác-> Tùy chọn". Ở đây tôi cuộn xuống "Sao chép bảng vào (cơ sở dữ liệu). Chọn" Chỉ cấu trúc ". Đổi tên bảng một cái gì đó, có thể chỉ cần thêm từ" sao chép "bên cạnh tên bảng hiện tại. Nhấp vào" Đi "Điều này sẽ tạo mới bảng. Xuất bảng mới và nhập nó 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, thay đổi tên của bảng trở lại tên ban đầu. Chọn bảng mới, chọn nhập. Bỏ chọn "bật kiểm tra khóa ngoại". Chọn "Đi". Cho đến nay tất cả đều hoạt động tốt.

Tôi đã đăng bản sửa lỗi của mình lên blog .


-1

Ngay cả tôi cũng có vấn đề tương tự. Và lỗi là do điểm đánh dấu "không dấu" trong bảng PK của FK


-6

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 và khắc phục sự cố.


Điều này không khắc phục vấn đề gì cả.
James111
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.