2009-11-17 66 views
68

Tôi phải tạo một db với 2 bảng trong mysql nhưng kịch bản thất bại với errno 150 (vấn đề khóa ngoại). Tôi đã kiểm tra lại hai trường khóa ngoài là giống nhau trên cả hai bảng và tôi không thể tìm thấy lỗi nào.Mysql. Không thể tạo bảng errno 150

Đây là kịch bản:

SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL'; 

DROP SCHEMA IF EXISTS `testdb`; 
CREATE SCHEMA IF NOT EXISTS `testdb` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ; 
USE `testdb`; 

DROP TABLE IF EXISTS `testdb`.`table1` ; 

CREATE TABLE IF NOT EXISTS `testdb`.`table1` (
    `id` INT UNSIGNED NOT NULL , 
    `field1` VARCHAR(50) NULL , 
    PRIMARY KEY (`id`)) 
ENGINE = InnoDB; 



DROP TABLE IF EXISTS `testdb`.`table2` ; 

CREATE TABLE IF NOT EXISTS `testdb`.`table2` (
    `id` INT NOT NULL AUTO_INCREMENT , 
    `field1` VARCHAR(50) NULL , 
    `date` DATE NULL , 
    `cnt` INT NULL , 
    PRIMARY KEY (`id`) , 
    INDEX `FK_table2_table1` (`field1` ASC) , 
    CONSTRAINT `FK_table2_table1` 
    FOREIGN KEY (`field1`) 
    REFERENCES `testdb`.`table1` (`field1`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

SET [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_UNIQUE_CHECKS; 

Tôi đã thử nó trong Windows và Ubuntu với các phiên bản khác nhau của Mysql và đã không làm việc.

Bất kỳ ý tưởng nào? Cảm ơn rất nhiều.

+9

Tôi cũng nhận được lỗi này bằng cách cố gắng tạo một bảng có ràng buộc FK cho bảng khác chưa tồn tại. Đó là một vấn đề dễ dàng để sửa chữa, thực hiện rất khó khăn bởi một thông báo lỗi hoàn toàn vô dụng. – Cerin

+2

Đối với những người nhận được ở đây từ google, lỗi này cũng có thể xảy ra nếu bạn thực hiện một lỗi đánh máy trên tên bảng của nước ngoài. –

Trả lời

54

table1.field1 không có chỉ mục nào được xác định trên đó.

Bắt buộc phải đặt một ràng buộc FOREIGN KEY trên field1.

Với điều này:

CREATE TABLE IF NOT EXISTS `testdb`.`table1` (
    `id` INT UNSIGNED NOT NULL , 
    `field1` VARCHAR(50) NULL , 
    KEY ix_table1_field1 (field1), 
    PRIMARY KEY (`id`)) 
ENGINE = InnoDB; 

Tất cả mọi thứ nên sau đó làm việc như mong đợi.

+5

Theo hướng dẫn, nó không cần phải là UNIQUE. –

+0

'@Vilx:' đúng và 15 ký tự. – Quassnoi

+17

Mặc dù nó không áp dụng trong trường hợp này, bạn sẽ nhận được thông báo lỗi tương tự nếu bạn cố gắng thêm một ràng buộc khóa ngoài và trên xóa được đặt thành null cho một cột không nullable. –

13

Tùy thuộc vào phiên bản MySQL bạn có thể cần phải tạo chỉ mục trên table1.field1 trước tiên.

1

Nếu không có gì hoạt động, hãy thử cách này:

Tên khóa ngoại là bản sao của khóa đã tồn tại. Kiểm tra xem tên khóa ngoại của bạn có phải là duy nhất trong cơ sở dữ liệu của bạn hay không. Chỉ cần thêm một vài ký tự ngẫu nhiên vào cuối tên khóa của bạn để kiểm tra điều này.

0

Luôn tạo bảng chính/bảng gốc, sau đó tạo chi tiết/bảng con của bạn.

5

Một tùy chọn (tùy từng trường hợp) sẽ được vô hiệu hóa việc kiểm tra tính toàn vẹn mysql:

SET FOREIGN_KEY_CHECKS = 0; 
0

Trong trường hợp của tôi, một bảng được sử dụng ràng buộc khoá ngoại trên một bảng mà không tồn tại được nêu ra. Điều này đã xảy ra do một makefile lớn, vì vậy nó không phải là rõ ràng như tôi đã mong đợi.

0

Trong trường hợp ai đó vẫn gặp sự cố với điều này, tôi đã thử tất cả các giải pháp ở trên (ngoại trừ SET FOREIGN_KEY_CHECKS) và không có tác dụng nào. Vấn đề là khi bạn tham khảo bảng đầu tiên, một số cơ sở dữ liệu phân biệt chữ hoa chữ thường với tên bảng. Tôi nghĩ điều này thật kỳ lạ vì tôi chưa bao giờ thấy điều này trước đây trên MySQL, Oracle và bây giờ điều này đã xảy ra với tôi trên MariaDB.

Ví dụ:

Tạo bảng nếu không tồn tại CADASTRO_MAQUINAS ( Id VARCHAR (16), Primary Key (Id) );

Tạo bảng nếu không tồn tại infos ( Id_Maquina VARCHAR (16) NOT NULL, CONSTRAINT FK_infos_cadastro_maquinas Ngoại Key (Id_Maquina) tham chiếu CADASTRO_MAQUINAS (Id) );

Nếu tôi cố gắng tạo bảng thứ hai bằng cách sử dụng cadastro_maquinas (chữ thường) thay vì CADASTRO_MAQUINAS, tôi sẽ nhận được lỗi này.

0

Tôi đã sử dụng MySQL workBench.Vấn đề là bạn không thể sử dụng cùng một số foreign key name, chúng cần phải là unique. Vì vậy, nếu có nhiều hơn một bảng sẽ tham chiếu cùng một khóa ngoại, mỗi lần phải có tên là unique.

50

Trong khi làm việc với MySQL Workbench và MySQL 5.5.27, tôi đã gặp phải vấn đề tương tự. Trong trường hợp của tôi là với các trường kiểu INT. Một cách sai lầm trong một bảng là INT UNSIGNED và trong bảng tham chiếu nó là INT.

+11

Đây chính là vấn đề của tôi. Cảm ơn bạn! –

6

Một gợi ý:

Ngay cả khi các kiểu dữ liệu của bạn dường như là giống nhau - trong trường hợp của tôi cả hai cột có VARCHAR(50) - điều này là không đủ.

Bạn cũng cần phải đảm bảo rằng cả hai cột có cùng một COLLATION.

8

Một trong những câu trả lời ở đây gợi ý vô hiệu hóa kiểm tra tính toàn vẹn khóa ngoại. Đây là một ý tưởng tồi. Có hai thủ phạm có khả năng ở đây: loại

  • dữ liệu không phù hợp giữa khóa chính tham chiếu và tham khảo chính nước ngoài
  • chỉ số. Bất kỳ khóa ngoại nào mà bạn chỉ mục phải là NOT NULL
+1

đối với tôi đó là kiểu dữ liệu không phù hợp ... cảm ơn sự giúp đỡ! – sbditto85

+0

Đối số NOT NULL không áp dụng trên Mysql 5.5 –

0

Tôi gặp lỗi tương tự trên một trong các bảng của mình. Khi cột được chọn Collation là khác nhau, mà làm việc một lần thay đổi cả hai cột để cùng một loại Collation.

Sau khi đọc hầu hết các giải pháp được đề xuất tại đây. Tôi chỉ nghĩ rằng nó có thể hữu ích nếu tôi chỉ liệt kê tất cả các khả năng mà có thể ném lỗi này.

1, Kiểm tra trường hợp của Cột 2, Kiểm tra đối chiếu Cột 3, Kiểm tra nếu có một phím được tạo ra trong cả hai bàn cho cột (Unique, tiểu học)

5

Tuy nhiên, một nguyên nhân, mặc dù hơi tương tự cho người khác: Tôi đã đề cập đến một bảng hóa ra có động cơ MyISAM, thay vì InnoDB.

0

Trong trường hợp của tôi, tôi có định nghĩa bảng cũ MyISAM ở một trong các bảng và rõ ràng là tôi không thể tạo khóa ngoại cho nó từ một bảng khác. Có lẽ điều này giúp một ai đó.

Vì vậy, điều này có thể xảy ra vì mâu thuẫn giữa hai cơ sở dữ liệu/lĩnh vực định nghĩa thử để kiểm tra:

Field Type 
Field Collation 
Table Engine 
5

MySQL cũng sẽ ném lỗi này nếu bạn đánh nhầm tên của bảng liên quan. Tôi kéo tóc ra một lúc cho đến khi tôi nhận ra mình đã bỏ lỡ một lá thư ở foreign key (column1) references mistyped_table(column1)

+0

Trong một số trường hợp, trường hợp (của tên bảng) quan trọng - trong một số không. Ví dụ, kịch bản của tôi làm việc trên mysql trên OSX, nhưng trên linux tôi đã có vấn đề này errno: 150. Trường hợp là vấn đề của tôi. – prule

+0

Tương tự như vậy, tôi đã có 'NGOẠI HỐI KEY (user_id) TÀI LIỆU THAM KHẢO (id) ON DELETE CASCADE', nhưng bảng' user' không có trường 'id' - nó được gọi là' user_id'! Vì vậy, ở trên tôi đã thay đổi 'user (id)' thành 'user (user_id)', và tất cả đều tốt trong vũ trụ một lần nữa ... cho đến bây giờ. – elimisteve

0

Đối với tôi, vấn đề là sử dụng CONSTRAINT trong truy vấn CREATE TABLE.

0

Bạn cũng có thể gặp phải lỗi tương tự khi cố gắng tham chiếu khóa tổng hợp trong khóa ngoại của bạn.

Ví dụ:

CREATE TABLE `article` (
    `id` int(10) unsigned NOT NULL, 
    `type` enum('X','Y','Z') NOT NULL, 
    PRIMARY KEY (`id`,`type`) 
) ENGINE InnoDB; 

CREATE TABLE `t1` (
    `user_id` int(10) unsigned NOT NULL, 
    `type` enum('X','Y','Z') NOT NULL, 
    `article_id` int(10) unsigned NOT NULL, 
    CONSTRAINT `user_access_article_ibfk_2` FOREIGN KEY (`article_id`, `type`) REFERENCES `article` (`id`, `type`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB 

Trong trường hợp này, điều quan trọng là sử dụng article_id và loại lĩnh vực trong định nghĩa FK theo thứ tự rất giống như chúng xuất hiện trong bảng bài viết định nghĩa PRIMARY KEY.

0

Trong trường hợp của tôi có thể là lỗi máy chủ khi thả một bảng có cùng tên. Rơi toàn bộ shcema và tái tạo nó giải quyết được vấn đề.

0

Nếu bạn đang làm việc trên mysql workbench và bạn nhận được lỗi này cho một bảng mối quan hệ có thể có một sửa chữa nhanh chóng cho bạn: chỉ cần xóa nó và để cho mysql workbench tái tạo nó cho bạn. Sau đó sao chép sql. Đã khắc phục sự cố errno 150 của tôi.

0

Tôi gặp lỗi này khi cố gắng sử dụng khóa ngoại để tham chiếu một trường không phải duy nhất. (không được phép apparently)

0

Khi tôi gặp sự cố này, đó là vì tôi đã đặt id trong bảng đầu tiên là unsigned trong khi khóa ngoại trong bảng thứ hai thì không. Làm cho chúng cả hai unsigned sửa nó cho tôi.

Các vấn đề liên quan