2011-05-04 51 views
8

Tôi đã tạo ra bảng bằng kịch bản:Lỗi "Không thể tạo bảng ..." trên thêm FOREIGN KEY

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; 

DROP TABLE IF EXISTS `Table1`; 
CREATE TABLE IF NOT EXISTS `Table1` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `parentId` bigint(20) DEFAULT NULL, 
    `name` varchar(1024) NOT NULL, 
    `description` varchar(16384) NOT NULL DEFAULT '', 
    `imageId` bigint(20) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `name` (`name`(255)), 
    KEY `parentId` (`parentId`), 
    KEY `imageId` (`imageId`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=27 ; 


INSERT INTO `Table1` (`id`, `parentId`, `name`, `description`, `imageId`) VALUES 
(0, NULL, 'name1', '', NULL), 
(12, 0, 'name2', '', NULL); 

Sau đó, tôi cố gắng thêm khóa ngoại:

ALTER TABLE `Table1` 
    ADD CONSTRAINT `Table1_ibfk_2` 
    FOREIGN KEY (`parentId`) REFERENCES `Table1` (`id`); 

Và có được lỗi sau:

ERROR 1005 (HY000): Can't create table 'sandbox.#sql-c28_4c' (errno: 150) 

Điều gì là sai?

tôi chạy

SHOW ENGINE INNODB STATUS; 

Có MỚI NHẤT LỖI CHÍNH NƯỚC NGOÀI sau:

------------------------ 
LATEST FOREIGN KEY ERROR 
------------------------ 
110504 22:06:55 Error in foreign key constraint of table sandbox/#sql-c28_61: 

    FOREIGN KEY (`parentId`) REFERENCES `Table1` (`id`): 
Cannot resolve table name close to: 
(`id`) 
------------ 

Nhưng nó không giúp tôi nhận ra những gì là sai.

tôi sử dụng Windows Vista, MySql 5.5.11

UPDATE:

Vấn đề này xuất hiện khi tôi nâng cấp từ MySql 5.0.67.

Trả lời

4

nền

ERROR 1005 (HY000): Can't create table 'sandbox.#sql-c28_4c' (errno: 150)

Khi bạn lệnh MySQL để ALTER TABLE nó thực sự các bước sau:

  1. sao chép dữ liệu từ bảng hiện có để một bảng tạm thời mới.
  2. Thay đổi cấu trúc của bảng tạm thời mới
  3. xóa bảng cũ
  4. đổi tên bảng tạm thời thành old_table_name.

Vấn đề
Yêu cầu của bạn đang thất bại ở bước 1.
Lưu ý rằng tablenames liên kết đến tập tin.
Trên tab tablen có phân biệt chữ hoa chữ thường

Trên Windows, chúng không phân biệt chữ hoa chữ thường.

trả lời
Vì bạn đang rõ ràng là chạy Linux, trường hợp của bảng bạn đang REFERENCES cầu phải là trường hợp tương tự như trong định nghĩa của bảng, có lẽ tất cả các trường hợp thấp hơn.
Bạn đang chạy Windows, vì vậy trường hợp nhạy cảm không phải là vấn đề, có thể đó là công cụ bạn đang sử dụng, tôi cũng gặp vấn đề này và sử dụng tất cả chữ thường cho tablenames ở mọi nơi.

câu trả lời đúng
Đặt hệ thống variabele

lower_case_table_names=1 

Để thoát khỏi vấn đề này.

Note rằng nếu bạn có lower_case_table_names=2 trên Windows, hộp Windoze của bạn biến thành một trường hợp nhạy cảm Linux hộp như xa như MySQL là có liên quan!

Liên kết
http://dev.mysql.com/doc/refman/5.5/en/identifier-case-sensitivity.html

+0

Xin lỗi, nhưng câu trả lời thích hợp của bạn không phải là thích hợp :) Tôi sử dụng lower_case_table_names = 0, hơn nữa tôi muốn có http://bugs.mysql.com/bug.php?id=55222 cố định. Và hơn thế nữa: tất cả đều hoạt động tốt với MySql 5.1.56. Sẽ hạ cấp. Trong các tên tệp windows không phân biệt chữ hoa chữ thường, nhưng có các bảng nội bộ của mysql lưu trữ các tên bảng khác, và chúng có thể được xử lý phân biệt chữ hoa chữ thường tùy thuộc vào giá trị lower_case_table_names – sergtk

+1

@sergdev, từ tài liệu: Tên bảng và cơ sở dữ liệu được lưu trữ trên đĩa bằng cách sử dụng chữ cái được chỉ định trong câu lệnh CREATE TABLE hoặc CREATE DATABASE. So sánh tên có phân biệt chữ hoa chữ thường. Bạn không nên đặt biến này thành 0 nếu bạn đang chạy MySQL trên một hệ thống có tên tệp phân biệt chữ hoa chữ thường (chẳng hạn như Windows hoặc Mac OS X). Nếu bạn buộc biến này thành 0 với --lower-case-table-names = 0 trên hệ thống tệp phân biệt chữ hoa chữ thường và truy cập vào tab kiểu chữ MyISAM bằng cách sử dụng các chữ cái khác nhau, tham số chỉ mục có thể dẫn đến. ** trông giống như cài đặt của bạn: ** ' lower_case_table_names = 0' ** là vấn đề ** – Johan

0

Tôi nghĩ rằng việc khai báo khóa ngoại của bạn có thể sai, tùy thuộc vào những gì bạn đã thực sự sau đó. Điều này dường như nói rằng 'parentID' từ 'Table1' sẽ tham chiếu trường 'id' từ 'Table1'.

ALTER TABLE `Table1` 
    ADD CONSTRAINT `Table1_ibfk_2` 
    FOREIGN KEY (`parentId`) REFERENCES `Table1` (`id`); 

Có thể thử này:

ALTER TABLE `Table1` 
    ADD CONSTRAINT `Table1_ibfk_2` 
    FOREIGN KEY (`id`) REFERENCES Parent(`parentId`); 
+0

KEY NGOÀI ('parentId') TÀI LIỆU THAM KHẢO' Table1' ('id'); là những gì tôi muốn. Tôi muốn rằng parentId tham chiếu cùng một bảng và có một trong các giá trị của id-cột. Trong thực tế, đây là cấu trúc giống cây. – sergtk

+0

Tôi không chắc đó có phải là điều bạn đang làm hay không, tôi đã nghĩ đó sẽ là giải pháp đơn giản nhất. –

+0

Mã này có hoạt động trước và sự cố chỉ xuất hiện sau khi bạn cập nhật phiên bản? –

1

Tìm thấy cách giải quyết.

Tên bảng phải ở dạng chữ thường sau REFERENCES.

ALTER TABLE `Table1` 
    ADD CONSTRAINT `Table1_ibfk_2` 
    FOREIGN KEY (`parentId`) REFERENCES `table1` (`id`); 

Dường như lỗi trong MySql 5.5.11.

FI. phpmyadmin không thể thêm khóa ngoại.

Xuất cũng tạo ra tên bảng chữ thường.

MySql 5.1.56 hoạt động như mong đợi.

+0

Trông giống như một lỗi thực sự: http://bugs.mysql.com/bug.php?id=60229 – Benjamin

+0

Thật tốt khi hy vọng rằng nó sẽ được sửa. Bây giờ tôi trở lại phiên bản cũ hơn. – sergtk

1

Trong trường hợp của tôi đó là do thực tế là lĩnh vực đó là một lĩnh vực trọng điểm nước ngoài có một cái tên quá dài, ví dụ. foreign key (some_other_table_with_long_name_id). Hãy thử sth ngắn hơn. Thông báo lỗi là một chút sai lầm trong trường hợp đó.

Định nghĩa trường cũng phải giống nhau (xem ra cho unsigned loại phụ).

0

tôi đã cùng một ngoại lệ:

[PDOException]                     
    SQLSTATE[HY000]: General error: 1005 Can't create table 'service.#sql-4851_c07' (errno: 150) 

Vấn đề tôi đã có được, lĩnh vực tôi muốn làm khoá ngoại trên đã không được phép NULL :) Sau khi tôi phát hiện ra tôi đã phải làm cho nó cho phép để được null, mọi thứ bắt đầu hoạt động.

Tất nhiên trong câu hỏi ban đầu, đó không phải là trường hợp, tôi chỉ muốn cho người khác biết về một giải pháp có thể.

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