MySQL: Không thể tạo bảng (errno: 150)


156

Tôi đang cố gắng nhập tệp .sql và nó không thể tạo bảng.

Đây là truy vấn không thành cô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 .sql từ cùng một cơ sở dữ liệu, tôi đã bỏ tất cả các bảng và bây giờ tôi đang cố gắng nhập nó, tại sao nó lại thất bại?

MySQL: Không thể tạo bảng './dbname/data.frm' (errno: 150)


1
Về cơ bản tất cả các nguyên nhân gây ra lỗi này, đây là một nguồn tài nguyên đầy đủ cho những gì gây ra lỗi 150 (và errno 121 / các lỗi khóa ngoại khác) trong MySQL.
John Smith

21
Tôi thấy rằng các cột phải giống hệt nhau (ngay cả cờ không dấu phải khớp).
Justin Skiles

3
@ JohnSmith ... ở đâu?
Charles Wood

3
Tôi đề nghị đọc bài đăng trên blog này liệt kê 10 nguyên nhân có thể xảy ra: Verysimple.com/2006/10/22/ Khăn
Mark Amery

@CharlesWood: " John Smith ... đã xem ngày 6 tháng 4 năm 13 lúc 19:29 ", đó là khoảng ba tháng trước khi nhận xét của bạn. Tôi có một nỗi sợ hãi, rằng một bí ẩn về "nơi" sẽ không được tiết lộ cho đến khi kết thúc thế giới ẩm ướt này! :>
trejder

Câu trả lời:


167

Từ MySQL - Tài liệu ràng buộc chính NGOẠI TỆ :

Nếu bạn tạo lại một bảng đã bị loại bỏ, nó phải có một định nghĩa phù hợp với các ràng buộc khóa ngoại tham chiếu đến nó. Nó phải có tên và loại cột chính xác và nó phải có các chỉ mục trên các khóa được tham chiếu, như đã nêu trước đó. Nếu những điều này không được thỏa mãn, MySQL trả về Lỗi 1005 và đề cập đến Lỗi 150 trong thông báo lỗi, điều đó có nghĩa là ràng buộc khóa ngoài không được hình thành chính xác. Tương tự, nếu ALTER TABLE không thành công do Lỗi 150, điều này có nghĩa là định nghĩa khóa ngoài sẽ được hình thành không chính xác cho bảng đã thay đổi.


1
Hai cột từ một bảng có thể tham chiếu một cột từ một bảng khác, đó là PK không?
Eugene

1
@Eugene: Mỗi cộ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ối quan hệ khóa ngoại duy nhất.
Ngựa Non OMG

1
@OMGPonies: Cảm ơn bạn đã trả lời câu hỏi này! .. Tôi đã tìm nó ... Tôi cũng đã hỏi một câu hỏi ở đây stackoverflow.com/questions/13487010/iêu .... Mặc dù tôi có một số câu trả lời hay nhưng tôi muốn tuân thủ Whether its possible to write Nested Query for my problem? .. Tôi sẽ yêu cầu bạn vui lòng trả lời tôi quá!
Grijesh Chauhan

19
Lỗi của tôi là bảng chính có MyISAM và bảng con công cụ InnoDB. Tập lệnh create.sql hiện tại đang sử dụng InnoDB cho tất cả các bảng, nhưng tôi đã cài đặt rất cũ trong đó tập lệnh đầu tiên sử dụng MyISAM.
Ai

2
@Whome - Đúng, gặp vấn đề tương tự ở đây.
aroth

96

Lỗi 150 có nghĩa là bạn gặp vấn đề với khóa ngoại của mình. Có thể khóa trên bảng nước ngoài không phải là cùng một loại?


15
Cảm ơn :) đối với tôi, các loại dữ liệu là INT nhưng một loại không dấu trong khi loại kia thì không
Anh Nguyễn

6
Tôi thường chạy ngang BIGINTso với INTkhi sử dụng các trình tạo lược đồ.
Xeoncross

Tôi gặp vấn đề tương tự khi khóa ngoại không phải là giá trị INT. Cột phải là ĐỘC ĐÁO khi khóa ngoại liên quan đến nó.
PhátHV

62

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 ERRORtrong đầu ra.

Nguồn: trả lời từ một người dùng khác trong một câu hỏi tương tự


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

cảm ơn. Thật xấu hổ khi MySQL Workbench không sử dụng điều này.
scipilot

Tuyệt vời. Điều này rất hữu ích. Cho bạn biết lỗi chính xác. Của tôi là, đã thực hiện Cột NULLABLE nhưng đã đặt "on xóa set null". Cảm ơn bạn rất nhiều.
Abhishek Saini

Nếu bạn có đặc quyền trên máy chủ của mình :(
Christopher Smit

30

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


4
Cảm ơn các bit đối chiếu.
A la hán

25

Tôi nghĩ rằng tất cả những câu trả lời trong khi chính xác là sai lệch cho câu hỏi.

Câu trả lời thực tế là đây trước khi bạn bắt đầu khôi phục, nếu bạn đang khôi phục tệp kết xuất bằng khóa ngoại:

SET FOREIGN_KEY_CHECKS=0;

bởi vì tự nhiên việc khôi phục sẽ tạo ra một số ràng buộc trước khi bảng nước ngoài tồn tại.


Làm điều này không làm việc cho tôi, vẫn đưa ra lỗi. Có ý kiến ​​gì không?
Joseph Astrahan

24

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 liên quan. Ví dụ: một bảng có thể đang sử dụng InnoDB trong khi bảng khác sử dụng MyISAM. Cả hai cần phải giống nhau


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

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

Điều này có thể xảy ra nếu bạn tạo một tệp sql của bảng innodb bằng mysqldump và chúng được xuất dưới dạng myisam Talbes thay thế.
Amado Martinez

11

Lỗi không. 150 có nghĩa là một lỗi ràng buộc khóa ngoại. Bạn có thể đang tạo bảng này trước bảng 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ể.


10

Có khá nhiều thứ có thể gây ra lỗi 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à gần với danh sách đầy đủ (nguồn Nguyên nhân của Errno 150 ):

Đối với errno 150 hoặc errno 121, chỉ cần gõ vào TÌNH TRẠNG SHOW Engine INNODB, có một phần gọi là "LRI TỪ KHÓA NGOẠI TỆ 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 vấn đề là gì. Bạn cần các đặc quyền SIÊU để chạy nó, vì vậy nếu bạn không có điều đó, bạn sẽ phải kiểm tra các tình huống sau.

1) Kiểu dữ liệu không khớp: Các loại cột phải giống nhau

2) Cột cha mẹ không được lập chỉ mục (hoặc được lập chỉ mục theo thứ tự sai)

3) Ghép cột Không khớp

4) Sử dụng SET NULL trên cột KHÔNG NULL

5) Ghép bảng không khớp: ngay cả khi đối chiếu cột khớp với nhau, trên một số phiên bản MySQL, đây có thể là một vấn đề.

6) Cột cha mẹ không thực sự tồn tại trong bảng cha mẹ. Kiểm tra chính tả (và có lẽ 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 trong các cột không đầy đủ hoặc cột quá dài cho một chỉ mục hoàn chỉnh. Lưu ý rằng MySQL (trừ khi bạn tinh chỉnh nó) có độ dài khóa cột tối đa là 767 byte (điều này tương ứng với cột UTF (255) varchar)

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

1) Tên ràng buộc bạn chọn đã được sử dụng

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


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

Cảm ơn, điều này thật tuyệt: | ------------------------ | LRI NGOẠI TỆ MỚI NHẤT | ------------------------ | Bạn đã xác định một điều kiện SET NULL mặc dù một số | các cột được định nghĩa là KHÔNG NULL.
Sam Critchley

8

Đôi khi MySQL cực kỳ ngu ngốc - tôi có thể hiểu nguyên nhân gây ra khóa ngoại .. nhưng trong trường hợp của tôi, tôi vừa bỏ toàn bộ cơ sở dữ liệu, và tôi vẫn gặp lỗi ... tại sao? ý tôi là, không còn 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ủ "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 tôi ... nhưng tôi có thể giải quyết nó :) Chỉ cần thêm hai dòng SQL này xung quanh câu lệnh chết tiệt 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 sẽ được thực thi ... Nếu bạn thực sự gặp vấn đề về khóa ngoài, nó sẽ hiển thị cho bạn theo dòng nơi bạn sẽ bật lại kiểm tra - điều này sẽ thất bại sau đó .. nhưng máy chủ của tôi chỉ im lặng :)


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

Cái nhìn sâu sắc thú vị @juacala :) Chỉ buồn cười với tôi, mỗi khi tôi gặp phải vấn đề này, cách tiếp cận của tôi luôn khắc phục nó ... cho đến ngày hôm nay ít nhất: D Nhưng chúng tôi không bao giờ ngừng học hỏi, phải không;)
jebbie 19/03/2015

Điều này thực sự đã giúp tôi với một kịch bản hóa lỏng được tạo ra. 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

4

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 các lỗi Ngoại khóa trong MySQL (1005 - lỗi 150).

Để khóa ngoại được tạo đúng, tất cả các yêu cầu của MySQL là:

  • Tất cả các khóa được tham chiếu PHẢI có chỉ số CHÍNH HÃNG hoặc ĐỘC ĐÁO.
  • Cột tham chiếu lại PHẢI có kiểu dữ liệu giống hệt với cột được tham chiếu.

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


4

Tôi gặp lỗi này khi đã chuyển ứng dụng Windows sang Linux. Trong Windows, 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 Table1cũng giống như table1, và trong REFERENCEScả hai table1Table1hoạt động. Trên Linux, khi ứng dụng được sử dụng table1thay vì Table1khi nó tạo cấu trúc cơ sở dữ liệu, tôi thấy lỗi # 150; Khi tôi tạo trường hợp ký tự chính xác trong các Table1tham chiếu, 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 ích, hãy đảm bảo rằng REFERENCESbạn sử dụng trường hợp ký tự chính xác trong tên bảng khi bạn sử dụng Linux.


Đây cũng là trường hợp của tôi! Chuyển tập lệnh từ phiên bản không phân biệt chữ hoa chữ thường (OS X) sang phiên bản mysql phân biệt chữ hoa chữ thường (Debian).
mircealungu

3

Thay đổi công cụ của các bảng của bạn, chỉ innoDB hỗ trợ các khóa ngoại


3

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..cũng 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 mã thành bảng mã PK thì nó đã được thực thi 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;

3

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à một 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.


3

Trong hầu hết các trường hợp, sự cố là do sự khác biệt của ĐỘNG CƠ. Nếu cha mẹ được tạo bởi InnoDB thì các bảng tham chiếu được cho là do MyISAM tạo và ngược lại


3

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ì máy chủ Hosting của tôi thay đổi cài đặt và các 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.


Điều này phù hợp với tôi, vì tôi đã thay đổi cơ sở dữ liệu không phải do tôi tạo ra.
FonzTech

3

thông thường, sự không phù hợp giữa khóa ngoại & khóa chính gây ra lỗi: 150.

Các chính nước ngoài phải có cùng kiểu dữ liệu như là khóa chính . Ngoài ra, nếu khóa chính không được thì khóa ngoại cũng phải được .


3

Tôi đã có vấn đề tương tự. Nó liên quan đến bộ sưu tậpký tự cột của bảng . Đảm bảo Bộ ký tự và Đối chiếu phải giống nhau cho cả hai cột trên hai bảng. Nếu bạn muốn đặt một khóa ngoại trên đó. Ví dụ- Nếu bạn đặt khóa ngoại trên cột userID của bảng userImage tham chiếu cột userID của bảng người dùng. Sau đó, Collation phải giống nhau utf8_general_ci và Ký tự đặt utf8 cho cả hai cột của bảng. Nói chung khi bạn tạo một bảng, mysql lấy hai cấu hình này từ cài đặt máy chủ.


Tại sao tôi không thấy nhà thơ này trước đây!? Tôi đã dành một giờ để tìm ra nguyên nhân gốc rễ. Đó là bộ ký tự trong trường hợp của tôi. Bảng tham chiếu và tham chiếu phải có cùng bảng mã.
Sujit Joshi

2

Vui lòng đảm bảo cả cột khóa chính và cột được tham chiếu của bạn có cùng loại dữ liệu và thuộc tính (không dấu, nhị phân, zerofill không dấu, v.v.).


2

Trường hợp cạnh thực 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 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 cho cùng một tên cơ sở dữ liệu, vì vậy cơ sở dữ liệu được đổi tên (ví dụ my_db_renamed) có các ràng buộc khóa ngoài trong cơ sở dữ liệu mới được tạo (my_db)

Không chắc đây có phải là lỗi trong Sequel Pro 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 nó làm tôi mất phần tốt nhất của một buổi sáng: /


2

Tôi đã có những lỗi giống nhau. Trong trường hợp của tôi, lý do của lỗi là do 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ó câu lệnh KHÔNG NULL. Cho phép NULL trong lĩnh vực này giải quyết vấn đề.


2

Tôi đã đối mặt với loại vấn đề 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 chỉ viết những dòng trên Create.bat và chạy tập tin bat.

Lỗi của tôi là theo thứ tự thực hiện trong các tập tin sql của tôi. Tôi đã cố gắng tạo bảng với khóa chính và cả khóa ngoại. Trong khi nó 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ề những loại lỗi.

Nếu bạn tạo bảng có khóa ngoại thì hãy kiểm tra các bảng tham chiếu đã có hay chưa. Và cũng kiểm tra tên của các bảng và trường tham chiếu.


Nói cách khác, bạn đã cố gắng tạo một bảng có khóa ngoại trỏ đến một bảng khác chưa tồn tại. Tạo các bảng theo đúng thứ tự để giải quyết vấn đề.
Vincent

2

Tôi có một vấn đề tương tự nhưng tôi gặp phải là vì tôi đã thêm một trường mới vào một bảng hiện có dữ liệu và trường mới đang tham chiếu một trường khác từ bảng cha và cũng có Định nghĩa KHÔNG NULL và không có bất kỳ GIÁ TRỊ NÀO. - 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 vào các trường trống có giá trị từ bảng cha trên mỗi bản ghi, trước khi ràng buộc có thể được áp dụng. Mỗi khi áp dụng ràng buộc, nó cần giữ nguyên vẹn dữ liệu của bảng. Triển khai ràng buộc (Khóa ngoài) nhưng có một số bản ghi cơ sở dữ liệu không có các giá trị từ bảng cha có nghĩa là dữ liệu bị hỏng nên MySQL KHÔNG BAO GIỜ ĐƯỢC THỰC HIỆN CONSTRAINT CỦA BẠN

Điều quan trọng cần nhớ là trong các trường hợp thông thường nếu bạn lập kế hoạch cơ sở dữ liệu của mình trước thời hạn và thực hiện các ràng buộc trước khi chèn dữ liệu, kịch bản cụ thể này sẽ tránh được

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

  • Lưu dữ liệu bảng cơ sở dữ liệu của bạn
  • Cắt bớt dữ liệu bảng (và các tạo phẩm của bảng tức là các chỉ mục, v.v.)
  • Áp dụng các ràng buộc
  • Nhập dữ liệu của bạn

Tôi hi vọng điêu nay se giup được ai đo


1

Có lẽ điều này sẽ giúp? Định nghĩa của cột khóa chính phải giống hệt với cột khóa ngoại.


1

Đảm bảo rằng tất cả các bảng có thể hỗ trợ khóa ngoại - công cụ InnoDB


1

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.


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

1

Tôi đã gặp một vấn đề tương tự khi bỏ cơ sở dữ liệu Django mysql bằng một bảng duy nhất. Tôi đã có thể khắc phục sự cố bằng cách chuyển cơ sở dữ liệu vào 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 emacs và nhập tệp kết xuất sql đã sửa đổi vào phiên bản mới.

HTH Uwe


1

Tôi đã khắc phục vấn đề bằng cách chấp nhận biế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 gặp vấn đề tương tự khi thực hiện một loạt các lệnh MySQL. Của tôi xảy ra trong khi tạo bảng khi tham chiếu khóa ngoại đến bảng khác chưa được tạo. Đó là chuỗi sự tồn tại của bảng trước khi tham chiếu.

Giải pháp: Tạo các bảng cha trước tiên trước khi tạo bảng con có khóa 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.