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.
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
@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