2010-10-31 42 views
135

Tôi đang cố gắng nhập tệp .sql và lỗi của nó khi tạo bảng.MySQL: Không thể tạo bảng (errno: 150)

Dưới đây là các truy vấn mà không:

CREATE TABLE `data` (
`id` int(10) unsigned NOT NULL, 
`name` varchar(100) NOT NULL, 
`value` varchar(15) NOT NULL, 
UNIQUE KEY `id` (`id`,`name`), 
CONSTRAINT `data_ibfk_1` FOREIGN KEY (`id`) REFERENCES `keywords` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1;  

tôi xuất khẩu các sql từ cơ sở dữ liệu tương tự, Anh đã đánh rơi tất cả các bảng và bây giờ im cố gắng để nhập nó, tại sao nó không?

MySQL: Can't create table './dbname/data.frm' (errno: 150)

+19

tôi đã tìm thấy rằng các cột phải giống hệt nhau (ngay cả những cờ chưa ký phải khớp). –

+1

Đối với cơ bản tất cả các nguyên nhân của lỗi này, đây là một nguồn lực đầy đủ cho những gì gây ra errno 150 (và errno 121/lỗi khóa ngoài nước ngoài khác) trong MySQL. –

+3

@JohnSmith ... ở đâu? –

Trả lời

148

Từ MySQL - FOREIGN KEY Constraints Documentation:

If you re-create a table that was dropped, it must have a definition that conforms to the foreign key constraints referencing it. It must have the correct column names and types, and it must have indexes on the referenced keys, as stated earlier. If these are not satisfied, MySQL returns Error 1005 and refers to Error 150 in the error message, which means that a foreign key constraint was not correctly formed. Similarly, if an ALTER TABLE fails due to Error 150, this means that a foreign key definition would be incorrectly formed for the altered table.

+1

Có thể hai cột từ một bảng tham chiếu một cột từ một bảng khác, ở đó nó là PK không? – Eugene

+1

@Eugene: Mỗi một trong hai cột có thể có mối quan hệ khóa ngoài với PK trong một bảng khác - không phải cả hai cột là một mối quan hệ khóa ngoại. –

+1

@OMGPonies: Cảm ơn bạn đã trả lời câu hỏi này! .. Tôi đang tìm kiếm ... Tôi cũng đã đặt câu hỏi tại đây http://stackoverflow.com/questions/13487010/how-to-update-same-table-on- deletion-in-mysql .... Mặc dù tôi có một số câu trả lời hay nhưng tôi muốn tuân thủ 'Liệu có thể viết truy vấn lồng nhau cho vấn đề của tôi' không? ..Tôi cũng sẽ yêu cầu bạn trả lời tôi! –

89

Lỗi 150 có nghĩa là bạn gặp sự cố với khóa ngoại. Có thể khóa trên bàn nước ngoài không phải là loại chính xác?

+14

Cảm ơn :) cho tôi, các kiểu dữ liệu là INT nhưng một unsigned trong khi khác không phải là –

+4

Tôi thường chạy trên 'BIGINT' vs' INT' khi sử dụng các trình tạo lược đồ. – Xeoncross

+0

Tôi chạy vào cùng một vấn đề khi khóa ngoài không phải là giá trị INT. Cột phải là UNIQUE khi khóa ngoại nghĩa đề cập đến nó. – PhatHV

10

Lỗi số. 150 có nghĩa là một ràng buộc khóa ngoại thất bại. Có thể bạn đang tạo bảng này trước bàn mà khóa ngoại phụ thuộc vào (bảng keywords). Tạo bảng đó trước và nó sẽ hoạt động tốt.

Nếu không, hãy xóa câu lệnh khóa ngoài và thêm nó sau khi bảng được tạo - bạn sẽ nhận được thông báo lỗi có ý nghĩa hơn về lỗi ràng buộc cụ thể.

26

Các kiểu dữ liệu phải phù hợp chính xác. Nếu bạn đang đối phó với các loại varchar, các bảng phải sử dụng cùng một đối chiếu.

+3

Cảm ơn bit collation. – arahant

18

Trong một số trường hợp, bạn có thể gặp thông báo lỗi này nếu có các công cụ khác nhau giữa các bảng có liên quan. Ví dụ, một bảng có thể sử dụng InnoDB trong khi bảng kia sử dụng MyISAM. Cả hai cần phải cùng

+0

Cảm ơn - đây là vấn đề của tôi. – scipilot

+0

Đó là vấn đề của tôi. Cảm ơn – thed0ctor

+0

Điều này có thể xảy ra nếu bạn đã tạo một file sql của bảng InnoDB sử dụng mysqldump và họ đã xuất khẩu như talbes MyISAM để thay thế. –

2

Thay đổi các công cụ của bảng của bạn, chỉ InnoDB hỗ trợ các phím nước ngoài

-6

Hãy thử:

CREATE TABLE `data` (
    `id` int(10) unsigned NOT NULL, 
    `name` varchar(100) NOT NULL, 
    `value` varchar(15) NOT NULL, 
UNIQUE KEY `id` (`id`,`name`), 
CONSTRAINT `data_ibfk_1`, 
FOREIGN KEY (`id`) REFERENCES `keywords` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

Bạn cần phải đặt một "" giữa CONSTRAINTFOREIGN.

0

Có lẽ this sẽ trợ giúp? Định nghĩa của cột khóa chính phải chính xác giống như cột khóa ngoài.

2

Nếu bảng PK được tạo trong một CHARSET và sau đó bạn tạo bảng FK trong một CHARSET khác ... bạn cũng có thể gặp lỗi này ... Tôi cũng gặp lỗi này nhưng sau khi thay đổi bảng ký tự thành bộ ký tự PK nó đã được thực hiện mà không có lỗi

create table users 
(
------------ 
------------- 
)DEFAULT CHARSET=latin1; 


create table Emp 
(
--------- 
--------- 
--------- 
FOREIGN KEY (userid) REFERENCES users(id) on update cascade on delete cascade)ENGINE=InnoDB, DEFAULT CHARSET=latin1; 
0

Hãy chắc chắn rằng tất cả các bảng có thể hỗ trợ chính nước ngoài - InnoDB cơ

22

tôi nghĩ rằng tất cả những câu trả lời trong khi đúng gây hiểu lầm cho các câu hỏi.

Câu trả lời thực tế là điều này trước khi bạn bắt đầu một khôi phục, nếu bạn đang khôi phục một tập tin dump với các phím nước ngoài:

SET FOREIGN_KEY_CHECKS=0; 

vì tự nhiên các khôi phục sẽ được tạo ra một số trở ngại trước bảng nước ngoài thậm chí tồn tại.

3

Sau khi bay qua các câu trả lời ở trên, và thử nghiệm một chút, đây là một cách hiệu quả để giải quyết lỗi ngoại khóa trong MySQL (1005 - lỗi 150).

Đối với khóa ngoại được tạo ra đúng cách, tất cả MySQL yêu cầu là:

  • Tất cả các phím tham chiếu PHẢI có một trong hai chỉ số chính hoặc UNIQUE.
  • Tham chiếu Cột một lần nữa PHẢI có kiểu dữ liệu giống hệt với cột Đã tham chiếu.

Đáp ứng các yêu cầu này và tất cả sẽ tốt.

7

Đôi khi MySQL chỉ là siêu ngu ngốc - tôi có thể hiểu lý do nguyên nhân của khóa ngoài .. nhưng trong trường hợp của tôi, tôi đã bỏ toàn bộ cơ sở dữ liệu, và tôi vẫn gặp lỗi ... tại sao? tôi có nghĩa là, không có cơ sở dữ liệu nữa ... và người dùng sql tôi đang sử dụng không có quyền truy cập vào bất kỳ db nào khác trên máy chủ ... ý tôi là, máy chủ là "trống" cho người dùng hiện tại và tôi vẫn nhận được lỗi này? Xin lỗi nhưng tôi đoán MySQL đang nói dối với tôi ... nhưng tôi có thể đối phó với nó :) Chỉ cần thêm hai dòng sau của SQL xung quanh tuyên bố fucky của bạn:

SET FOREIGN_KEY_CHECKS = 0; 
# some code that gives you errno: 150 
SET FOREIGN_KEY_CHECKS = 1; 

Bây giờ sql nên được thực hiện ... Nếu bạn thực sự có một vấn đề quan trọng nước ngoài, nó sẽ hiển thị cho bạn bởi dòng mà bạn sẽ cho phép kiểm tra một lần nữa - điều này sẽ thất bại sau đó .. nhưng máy chủ của tôi chỉ là yên tĩnh :)

+0

Điều này có thể gây ra vấn đề nếu có thực sự là sự khác nhau giữa cột và cột nó là tham khảo. Ví dụ. Giả sử cột tham chiếu là một varchar (200) và giới thiệu là varchar (50), sau đó hành vi kỳ lạ khi một thác được cố có thể xảy ra. Tôi đã không gặp phải vấn đề mà errno 150 được phát hành do dữ liệu không khớp. – juacala

+0

cái nhìn sâu sắc Thú vị @juacala :) vui với tôi là duy nhất, bất cứ khi nào tôi chạy vào này, cách tiếp cận của tôi luôn luôn cố định nó ... đến ngày hôm nay ít nhất: D Nhưng chúng ta không bao giờ ngừng học hỏi, phải;) – jebbie

+0

Điều này thực sự đã giúp tôi có một kịch bản tạo ra liquibase. Kịch bản chạy hoàn hảo trên MySQL> 5.5, nhưng không thành công cho phiên bản 5.1. – delbertooo

1

Hãy đảm bảo cả khóa chính của bạn cột và cột được tham chiếu có cùng kiểu dữ liệu và thuộc tính (unsigned, binary, unsigned zerofill etc).

2

Lỗi này có thể xảy ra nếu hai bảng có tham chiếu, ví dụ, một bảng là sinh viên và bảng khác là giáo dục và chúng tôi muốn bảng giáo dục có tham chiếu khóa ngoài của bảng sinh viên. Trong trường hợp này, kiểu dữ liệu cột cho cả hai bảng phải giống nhau, nếu không nó sẽ tạo ra lỗi.

2

Tôi gặp phải lỗi này khi đã chuyển ứng dụng Windows sang Linux. Trong Windows, các tên bảng cơ sở dữ liệu không phân biệt chữ hoa chữ thường và trong Linux chúng phân biệt chữ hoa chữ thường, có thể do sự khác biệt của hệ thống tệp. Vì vậy, trên bảng Windows Table1 cũng giống như table1 và trong REFERENCES cả hai table1Table1 hoạt động. Trên Linux, khi ứng dụng sử dụng table1 thay vì Table1 khi tạo cấu trúc cơ sở dữ liệu tôi thấy lỗi # 150; khi tôi tạo ra trường hợp ký tự đúng trong các tham chiếu Table1, nó cũng bắt đầu hoạt động trên Linux. Vì vậy, nếu không có gì khác giúp, hãy đảm bảo rằng trong REFERENCES bạn sử dụng đúng kiểu chữ trong tên bảng khi bạn sử dụng Linux.

47

Bạn có thể nhận được thông báo lỗi thực tế bằng cách chạy SHOW ENGINE INNODB STATUS; và sau đó tìm kiếm LATEST FOREIGN KEY ERROR ở đầu ra.

Nguồn: answer from another user in a similar question

+7

Điều này thực sự rất hữu ích. Nó cho bạn biết chính xác lỗi. –

+0

cảm ơn. Đó là một Workbench MySQL đáng xấu hổ không tận dụng được điều này. – scipilot

+0

Tuyệt vời. Điều này rất hữu ích. Cho bạn biết chính xác lỗi. Mine là, để có đã thực hiện các NULLABLE Cột nhưng đã thiết lập "về xóa bộ null". Cảm ơn bạn rất nhiều. –

1

Một trường hợp cạnh thực sự là nơi bạn đã sử dụng một công cụ MySQL, (Sequel Pro trong trường hợp của tôi) để đổi tên một cơ sở dữ liệu. Sau đó tạo ra một cơ sở dữ liệu có cùng tên.

Điều này giữ các ràng buộc khóa ngoài với cùng tên cơ sở dữ liệu, do đó cơ sở dữ liệu được đổi tên (ví dụ:my_db_renamed) có ràng buộc khóa ngoài trong cơ sở dữ liệu mới tạo (my_db)

Không chắc chắn đây có phải là lỗi trong phần tiếp theo hay không, hoặc nếu một số trường hợp sử dụng yêu cầu hành vi này, nhưng chi phí tốt nhất là một phần của buổi sáng:/

0

Cột của bảng PARENT mà bạn đang đề cập đến từ bảng con phải là duy nhất. Nếu không, gây ra lỗi không 150.

+0

nó có thể đáng để bạn thêm chi tiết hơn một chút - ví dụ như cột và tên bảng cụ thể – Jonathan

1

Tôi đã gặp lỗi tương tự. Trong trường hợp của tôi, lý do cho lỗi là tôi có câu lệnh ON DELETE SET NULL trong ràng buộc trong khi trường mà tôi đặt ràng buộc trong định nghĩa của nó có một câu lệnh NOT NULL. Cho phép NULL trong trường giải quyết được vấn đề.

8

Có khá một vài điều mà có thể gây ra errno 150, vì vậy đối với những người tìm kiếm chủ đề này, đây là những gì tôi nghĩ là một gần danh sách đầy đủ (nguồn Causes of Errno 150):

Đối với errno 150 hoặc errno 121, chỉ cần gõ vào SHOW ENGINE INNODB STATUS, có một phần được gọi là "L FORI L FORI NƯỚC NGOÀI MỚI NHẤT". Theo đó, nó sẽ cung cấp cho bạn một thông báo lỗi rất hữu ích, thông thường sẽ cho bạn biết ngay lập tức vấn đề là gì. Bạn cần đặc quyền SUPER để chạy nó, vì vậy nếu bạn không có điều đó, bạn sẽ chỉ phải kiểm tra các kịch bản sau đây.

1) Các loại dữ liệu không khớp nhau: Các loại của các cột phải cùng

2) Cột Chánh Không Indexed (Hoặc Indexed trong thứ tự sai)

3) Cột Collations Don' t trận đấu

4) Sử dụng SET NULL trên một cột NOT NULL

5) Bảng collations Đừng Phù hợp: ngay cả khi trận đấu collations cột, trên một số phiên bản MySQL này có thể là một vấn đề.

6) Cột gốc không thực sự tồn tại trong bảng cha. Kiểm tra chính tả (và có thể là khoảng trống ở đầu hoặc cuối cột)

7) Một trong các chỉ mục trên một cột không đầy đủ hoặc cột quá dài để có chỉ mục đầy đủ. Lưu ý rằng MySQL (trừ khi bạn tinh chỉnh nó) có độ dài khóa cột đơn tối đa là 767 byte (tương ứng với cột UTM (255) UTF)

Trong trường hợp bạn gặp lỗi 121, dưới đây là một số nguyên nhân:

1) tên hạn chế bạn chọn đã được sử

2) trên một số hệ thống nếu có một sự khác biệt trường hợp trong bản tuyên Bố và bảng tên của bạn. Điều này có thể cắn bạn nếu bạn đi từ một máy chủ khác có quy tắc xử lý trường hợp khác nhau.

+0

Trong một số phiên bản bạn nhận được sai số 150 nếu bảng không phải là innodb, nhưng trong một số phiên bản nó không thành công. – juacala

+0

Thanks, điều này thật tuyệt vời: | ------------------------ | L KEYI KHU VỰC NƯỚC NGOÀI MỚI NHẤT | ------------------------ | Bạn đã xác định điều kiện SET NULL mặc dù một số trong số | các cột được định nghĩa là NOT NULL. –

2

Trong hầu hết các trường hợp vấn đề là vì sự khác biệt ENGINE .Nếu phụ huynh được tạo ra bởi InnoDB sau đó các bảng tham chiếu phải được tạo ra bởi MyISAM & ngược lại

0

Tôi đã có một vấn đề tương tự khi bán phá giá một Cơ sở dữ liệu mysql Django với một bảng duy nhất. Tôi đã có thể khắc phục vấn đề bằng cách đổ cơ sở dữ liệu vào một tệp văn bản, di chuyển bảng được đề cập đến cuối tệp bằng cách sử dụng các emac và nhập tệp kết xuất sql đã sửa đổi vào cá thể mới.

HTH Uwe

1

Trong trường hợp của tôi.Tôi gặp vấn đề với công cụ và bộ ký tự vì cài đặt thay đổi máy chủ lưu trữ của tôi và bảng mới của tôi là MyISAM nhưng các bảng cũ của tôi là InnoDB. Chỉ cần tôi thay đổi.

0

Tôi gặp phải loại sự cố này trong khi tạo DB từ tệp văn bản.

mysql -uroot -padmin < E:\important\sampdb\createdb.sql 
mysql -uroot -padmin sampdb < E:\important\sampdb\create_student.sql 
mysql -uroot -padmin sampdb < E:\important\sampdb\create_absence.sql 

mysql -uroot -padmin sampdb < E:\important\sampdb\insert_student.sql 
mysql -uroot -padmin sampdb < E:\important\sampdb\insert_absence.sql 

mysql -uroot -padmin sampdb < E:\important\sampdb\load_student.sql 
mysql -uroot -padmin sampdb < E:\important\sampdb\load_absence.sql 

Tôi vừa viết các dòng ở trên Create.bat và chạy tệp dơi.

Lỗi của tôi là theo thứ tự thực thi trong các tệp sql của tôi. Tôi đã cố gắng tạo bảng với khóa chính và khóa ngoài. Trong khi chạy nó sẽ tìm kiếm bảng tham chiếu nhưng các bảng không có ở đó. Vì vậy, nó sẽ trả về loại lỗi đó.

If you creating tables with foreign key then check the reference tables were present or not. And also check the name of the reference tables and fields.

0

Tôi đã sửa chữa vấn đề bằng cách làm cho biến chấp nhận null

ALTER TABLE `ajout_norme` 
CHANGE `type_norme_code` `type_norme_code` VARCHAR(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL 
1

Tôi đã có một vấn đề tương tự nhưng tôi là vì tôi đã bổ sung thêm một lĩnh vực mới cho một bảng hiện có mà có dữ liệu, và lĩnh vực mới đã tham chiếu một lĩnh vực khác từ bảng cha và cũng đã có các Defination của NOT NULL và không có bất kỳ giá trị DEFAULT. - Tôi phát hiện ra lý do mọi thứ không hoạt động là vì

  1. Trường mới của tôi cần để tự động điền các trường trống có giá trị từ bảng cha trên mỗi bản ghi trước khi áp dụng ràng buộc. Mỗi khi ràng buộc được áp dụng, nó cần phải giữ nguyên tính toàn vẹn của dữ liệu bảng. Thực hiện chế (khoá ngoại) nhưng đã có một số hồ sơ cơ sở dữ liệu mà không có các giá trị từ bảng cha có nghĩa là các dữ liệu bị hỏng nên MySQL sẽ KHÔNG BAO GIỜ thực thi hạn chế của bạn

Điều quan trọng cần nhớ rằng dưới là trường hợp bình thường nếu bạn có kế hoạch cơ sở dữ liệu của bạn tốt trước thời hạn, và thực hiện những hạn chế trước khi chèn dữ liệu kịch bản đặc biệt này sẽ tránh được

Cách tiếp cận dễ dàng hơn để tránh điều này Gotcha là

  • Sa đã dữ liệu bảng cơ sở dữ liệu của bạn
  • Truncate các bảng dữ liệu (và hiện vật bảng tức là chỉ số vv)
  • Áp dụng chế
  • Nhập dữ liệu của bạn

Tôi Hy vọng điều này sẽ giúp người

0

tôi có cùng một vấn đề khi thực hiện một loạt các lệnh MySQL. Mỏ xảy ra trong quá trình tạo bảng khi tham chiếu khóa ngoài với bảng khác chưa được tạo. Đó là chuỗi tồn tại của bảng trước khi tham chiếu.

Giải pháp: Tạo bảng cha trước tiên trước khi tạo bảng con có khóa ngoài.

0

Tạo bảng không có khóa ngoài, sau đó đặt khóa ngoại riêng biệt.

0

usually, the mismatch between foreign key & primary key causes the error:150.

Các nước ngoài chủ chốt phải có cùng datatype như chính chủ chốt. Ngoài ra, nếu khóa chínhkhông được ký thì khóa ngoại cũng phải là không được ký.

4

tôi đã cùng một lỗi, sau đó tôi đã tạo ra tham chiếu bảng đầu tiên và sau đó gọi bảng

for example if you have employee and department tables your assigning foreign constraint on dept_no in employee table then make sure that the department table is created and have assigned primary key constraints to dept_no.

này làm việc cho tôi ...

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