2012-06-15 48 views
14

Tôi gặp lỗi khi cố gắng tạo bảng trong mysql.ERROR 1005 (HY000): Không thể tạo bảng (errno: 150)

Bất kỳ mẹo nào để giải quyết vấn đề này?

create table stock_in(
    ind int not null auto_increment, 
    itemcode varchar(10) not null, 
    quantity int not null, 
    description text not null, 
    sales_ref int not null default -1, 
    return_outwards_ref int not null default -1, 
    stock_in_receipt_ref int not null default -1, 
    date text not null, 
    time text not null, 
    username text not null, 
    foreign key (sales_ref) references sales (receiptno), 
    foreign key (return_outwards_ref) references returnoutwards(ind), 
    primary key (ind) 
); 

Các Lỗi:

ERROR 1005 (HY000): Can't create table 'posinventory.stock_in' (errno: 150) 
+0

Bạn đã tạo các bảng 'sales' và' returnoutwards' với các khóa duy nhất chưa? Tất cả các bảng phải là InnoDb. – Devart

+0

@Devart: Cảm ơn, tôi đã tìm thấy sai lầm của mình ... đó là vì biên nhận trong bảng bán hàng không phải là khóa chính ... Tôi nên tham chiếu đến cột mới với khóa chính, ví dụ: sales_no – Boon

Trả lời

25

Kiểm tra hướng dẫn MySQL về foreign key constrains:

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 right column names and types, and it must have indexes on the referenced keys, as stated earlier. If these are not satisfied, MySQL returns error number 1005 and refers to error 150 in the error message.

Một vài ý tưởng:

  • Better thả và tạo ra nó mới với cú pháp được định dạng tốt.
  • Đảm bảo thêm ENGINE=InnoDB; vào số CREATE TABLE - lệnh của bạn.
  • Đảm bảo InnoDB được bật trên máy chủ MySQL của bạn. Để xác minh điều này, hãy thử lệnh này: SHOW VARIABLES LIKE 'have_innodb'; - nếu nó trả về CÓ, thì InnoDB được bật.
  • Kiểm tra lệnh của bạn cho chữ hoa và chữ thường trong bảng và tên trường.
  • Kiểm tra không chỉ một bảng mà bạn muốn tạo, mà còn trên các bảng mà các khóa ngoại đang đề cập đến.
  • Đảm bảo các bảng được giới thiệu của bạn được lập chỉ mục đúng cách.
+0

Cảm ơn, tôi đã tìm thấy sai lầm của tôi ... đó là bởi vì các biên nhận trong bảng bán hàng không phải là một khóa chính ...Tôi nên tham khảo nó đến một cột mới với khóa chính, ví dụ, sales_no – Boon

+0

Tôi cũng đã có lỗi tương tự và khi tôi lập chỉ mục các bảng cha trên các khóa chính, lỗi đã được giải quyết. – sreeprasad

+2

Tôi muốn thêm rằng bạn nhận được thông báo nếu bất kỳ bảng nào bạn đang đề cập đến với FK của bạn không phải là cùng một công cụ; tốt, chắc chắn nếu họ không phải InnoDB. –

1

Một trong những lý do sẽ là kiểu dữ liệu cột khóa ngoài và chiều dài phải giống với cột khóa bảng giới thiệu. Ví dụ cột bảng giới thiệu là trung bình (11) và cột khóa ngoài là int (11) có nghĩa là lỗi sẽ xảy ra khi tạo bảng có khóa ngoài.

4

Có chính xác cùng một vấn đề. Nguồn của nó là trong các loại cho khóa và tham chiếu nước ngoài.

chính nước ngoài:

fer_id SMALLINT NOT NULL 

và lĩnh vực nguồn gốc (refernce mà chúng tôi cung cấp):

id INT(11) UNSIGNED NOT NULL 

Tôi vừa mới làm cho fer_id INT (11) UNSIGNED là tốt. Làm việc kỳ diệu!

1

Ngoài những thứ khác, bạn cần đảm bảo cả hai bảng/trường khớp với cài đặt CHARSET. Trường loại UTF có thể có kích thước khác biệt đáng kể so với 'latin1'. HIỂN THỊ CREATE TABLE trên cả hai bảng sẽ cho bạn thấy nếu có sự không phù hợp

1

Nếu bạn khôi phục sao lưu cơ sở dữ liệu của bạn, bạn có thể vô hiệu hóa các phím nước ngoài tạm thời kiểm tra bằng cách chèn những chuỗi trong sự khởi đầu của tập tin sql:

/*!40030 SET NAMES UTF8 */; 
/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 
/*!40101 SET @[email protected]@COLLATION_CONNECTION */; 
/*!40103 SET @[email protected]@TIME_ZONE */; 
/*!40103 SET TIME_ZONE='+00:00' */; 
/*!40014 SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; 
/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; 
/*!40101 SET @[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; 
/*!40111 SET @[email protected]@SQL_NOTES, SQL_NOTES=0 */; 
Các vấn đề liên quan