Mã lỗi: 1005. Không thể tạo bảng '…' (errno: 150)


103

Tôi đã tìm kiếm giải pháp cho vấn đề này trên Internet và kiểm tra các câu hỏi về Stack Overflow, nhưng không có giải pháp nào phù hợp với trường hợp của tôi.

Tôi muốn tạo khóa ngoại từ bảng sira_no đến metal_kod.

ALTER TABLE sira_no
    ADD CONSTRAINT METAL_KODU FOREIGN KEY(METAL_KODU)
    REFERENCES metal_kod(METAL_KODU)
    ON DELETE SET NULL
    ON UPDATE SET NULL ;

Tập lệnh này trả về:

Error Code: 1005. Can't create table 'ebs.#sql-f48_1a3' (errno: 150)

Tôi đã thử thêm một chỉ mục vào bảng được tham chiếu:

CREATE INDEX METAL_KODU_INDEX ON metal_kod (METAL_KODU);

Tôi đã kiểm tra METAL_KODU trên cả hai bảng (bảng mã và đối chiếu), nhưng tôi không thể tìm thấy giải pháp cho vấn đề này. Làm cách nào để khắc phục sự cố này?

Đây là bảng metal_kod:

METAL_KODU    varchar(4)    NO    PRI
DURUM    bit(1)    NO
METAL_ISMI    varchar(30)    NO
AYAR_YOGUNLUK    smallint(6)    YES        100

Bạn có thể hiển thị lược đồ cho metal_kodbảng ... trường nào trong bảng đó nên tham chiếu Khóa ngoại không?
Manse

Câu trả lời:


271

Mã lỗi: 1005 - có một tham chiếu khóa chính sai trong mã của bạn

Thông thường, đó là do trường khóa ngoại được tham chiếu không tồn tại. Có thể là bạn mắc lỗi đánh máy, hoặc trường hợp kiểm tra phải giống nhau hoặc có trường loại không khớp. Các trường được liên kết với khóa ngoại phải khớp chính xác với các định nghĩa.

Một số nguyên nhân đã biết có thể là:

  1. Hai loại trường khóa và / hoặc kích thước không khớp chính xác. Ví dụ, nếu một là INT(10)trường quan trọng cần phải INT(10)là tốt và không phải INT(11)hoặc TINYINT. Bạn có thể muốn xác nhận kích thước trường bằng cách sử dụng SHOW CREATE TABLEvì Trình duyệt truy vấn đôi khi sẽ hiển thị trực quan chỉ INTEGERcho cả INT(10)INT(11). Bạn cũng nên kiểm tra xem một cái không SIGNEDvà cái kiaUNSIGNED . Cả hai đều cần phải giống hệt nhau.
  2. Một trong những trường khóa mà bạn đang cố gắng tham chiếu không có chỉ mục và / hoặc không phải là khóa chính. Nếu một trong các trường trong mối quan hệ không phải là khóa chính, bạn phải tạo chỉ mục cho trường đó.
  3. Tên khóa ngoại là bản sao của khóa đã tồn tại. Kiểm tra xem tên khóa ngoại của bạn có phải là duy nhất trong cơ sở dữ liệu của bạn không. Chỉ cần thêm một vài ký tự ngẫu nhiên vào cuối tên khóa của bạn để kiểm tra điều này.
  4. Một hoặc cả hai bảng của bạn là một MyISAMbảng. Để sử dụng khóa ngoại, các bảng phải có cả hai InnoDB. (Trên thực tế, nếu cả hai bảng đều như vậy MyISAMthì bạn sẽ không nhận được thông báo lỗi - nó chỉ không tạo khóa.) Trong Trình duyệt truy vấn, bạn có thể chỉ định loại bảng.
  5. Bạn đã chỉ định một tầng ON DELETE SET NULL, nhưng trường khóa liên quan được đặt thành NOT NULL. Bạn có thể khắc phục điều này bằng cách thay đổi tầng của bạn hoặc đặt trường để cho phép NULLcác giá trị.
  6. Đảm bảo rằng các tùy chọn Bộ mã và Đối chiếu đều giống nhau ở cấp bảng cũng như cấp trường riêng lẻ cho các cột chính.
  7. Bạn có một giá trị mặc định (nghĩa là, mặc định = 0) trên cột khóa ngoại của bạn
  8. Một trong các trường trong mối quan hệ là một phần của khóa kết hợp (tổng hợp) và không có chỉ mục riêng của nó. Mặc dù trường có chỉ mục là một phần của khóa tổng hợp, bạn phải tạo chỉ mục riêng cho chỉ trường khóa đó để sử dụng nó trong một ràng buộc.
  9. Bạn có một lỗi cú pháp trong ALTER câu lệnh hoặc bạn đã nhập sai một trong các tên trường trong mối quan hệ
  10. Tên của khóa ngoại của bạn vượt quá độ dài tối đa là 64 ký tự.

Để biết thêm chi tiết, hãy tham khảo: Số lỗi MySQL 1005 Không thể tạo bảng


4
vấn đề là các ký tự khóa ngoại không khớp. Cảm ơn vì câu trả lời.
lamostreta

4
SHOW ENGINE INNODB STATUSnhư đã đề cập trong câu hỏi này đã giúp tôi chẩn đoán vấn đề cụ thể của tôi (PEBCAK, trong trường hợp của tôi ...)
Hobo

1
chết tiệt, ngay cả khi nó là một khóa chính. Bạn cần tạo chỉ mục riêng cho khóa đó. cảm ơn điều này đã giải quyết vấn đề của tôi.
RSB

3
# 4 là vấn đề của tôi - một trong các bảng là MyISAM và tập lệnh đã cố gắng tạo một bảng InnoDB. Tôi đã gặp sự cố này khi tôi đang cố gắng triển khai một hệ thống cũ ban đầu đang chạy MySQL 5.0 hoặc phiên bản tương tự, trong đó công cụ lưu trữ mặc định là MyISAM và các tập lệnh đang chạy OK. Môi trường hiện tại của tôi là 5.5 và bộ nhớ mặc định là InnoDB. Việc thêm set names 'utf8', storage_engine=MYISAM;vào đầu tập lệnh đã giải quyết được vấn đề cho tôi. Cảm ơn @ user319198 và @Stefano vì câu trả lời công phu! : o)
Boris Chervenkov

1
Thuộc tính của tôi thiếu thuộc tính "unsigned" như đã đề cập trong # 1, cảm ơn!
lãnh đạo

11

Điều này cũng có thể xảy ra khi xuất cơ sở dữ liệu của bạn từ máy chủ này sang máy chủ khác và các bảng được liệt kê theo thứ tự bảng chữ cái theo mặc định.
Vì vậy, bảng đầu tiên của bạn có thể có khóa ngoại của một bảng khác chưa được tạo. Trong những trường hợp như vậy, hãy vô hiệu hóa ngoại_trách_kiếm và tạo cơ sở dữ liệu.

Chỉ cần thêm phần sau vào tập lệnh của bạn:

SET FOREIGN_KEY_CHECKS=0;

và nó sẽ hoạt động.


4

Điều này rất thường xảy ra khi khóa ngoại và khóa tham chiếu không có cùng kiểu hoặc cùng độ dài.


4

Đôi khi có thể do bảng chính bị rớt (có thể do vô hiệu hóa ngoại_ khóa_chỉ), nhưng khoá ngoại CONSTRAINT vẫn tồn tại trong các bảng khác. Trong tôi trường hợp tôi đã giảm xuống bàn và cố gắng để tái tạo nó, nhưng nó đã được ném các lỗi tương tự đối với tôi.

Vì vậy, hãy thử loại bỏ tất cả các CONSTRAINT khóa ngoại từ tất cả các bảng nếu có và sau đó cập nhật hoặc tạo bảng.


2

Tôi đã gặp một lỗi tương tự. Vấn đề liên quan đến bảng con và bảng mẹ không có cùng bộ ký tự và đối chiếu. Điều này có thể được khắc phục bằng cách thêm ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;

CREATE TABLE IF NOT EXISTS `country` (`id` INT(11) NOT NULL AUTO_INCREMENT,...) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;

... trên câu lệnh SQL có nghĩa là có một số mã bị thiếu.


2

Khóa ngoại phải có cùng kiểu với khóa chính mà nó tham chiếu. Ví dụ có loại "INT UNSIGNED NOT NULL", phím phía trước cũng phải "INT UNSIGNED NOT NULL"

CREATE TABLE employees(
id_empl INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id)
);
CREATE TABLE offices(
id_office INT UNSIGNED NOT NULL AUTO_INCREMENT,
id_empl INT UNSIGNED NOT NULL,
PRIMARY KEY(id),
CONSTRAINT `constraint1` FOREIGN KEY (`id_empl`) REFERENCES `employees` (`id_empl`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='my offices';

không dấu là vấn đề đối với tôi. Cảm ơn!
Gabo

2

Mã lỗi: 1005

Tôi đã gặp sự cố tương tự, vì vậy đây là một số điều tôi đã thử (không theo bất kỳ thứ tự nào, ngoại trừ giải pháp :))

  1. Đã thay đổi tên khóa nước ngoài (nó không hoạt động)
  2. Giảm độ dài khóa ngoại
  3. Đã xác minh các kiểu dữ liệu (không có gì sai)
  4. Kiểm tra chỉ mục
  5. Kiểm tra các đối chiếu (mọi thứ đều ổn, anh yêu một lần nữa)
  6. Cắt ngắn bảng, không sử dụng tốt
  7. Đã bỏ bảng và tạo lại
  8. Đã cố gắng xem có bất kỳ tham chiếu vòng tròn nào đang được tạo không --- tất cả đều ổn
  9. Cuối cùng, tôi thấy rằng tôi có hai biên tập viên đang mở. Một trong PhpStorm (JetBrains) và bàn làm việc MySQL khác. Có vẻ như PhpStorm / MySQL Workbench tạo ra một số loại khóa chỉnh sửa.

    Tôi đã đóng PhpStorm chỉ để kiểm tra xem có phải trường hợp bị khóa hay không (có thể là theo cách khác). Điều này đã giải quyết vấn đề của tôi.


2

Tôi đã có cùng một thông báo lỗi. Cuối cùng, tôi phát hiện ra mình đã viết sai chính tả tên của bảng trong lệnh:

ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES country (id);

đấu với

ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES countries (id);

Tôi tự hỏi tại sao trên trái đất MySQL không thể nói một bảng như vậy không tồn tại ...


1

MyISAM vừa được đề cập. Chỉ cần thử thêm ENGINE = MyISAM DEFAULT CHARSET = latin1 AUTO_INCREMENT = 2; ở cuối một câu lệnh, giả sử rằng các bảng khác của bạn đã được tạo bằng MyISAM.

CREATE TABLE IF NOT EXISTS `tablename` (
  `key` bigint(20) NOT NULL AUTO_INCREMENT,
  FOREIGN KEY `key` (`key`) REFERENCES `othertable`(`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

1

Trong trường hợp của tôi, nó đã xảy ra khi một bảng là InnoB và bảng khác là MyISAM. Thay đổi công cụ của một bảng, thông qua MySQL Workbench, giải quyết cho tôi.


1

Nó xảy ra trong trường hợp của tôi, vì tên của bảng được tham chiếu trong khai báo ràng buộc không chính xác (tôi quên chữ hoa trong tên bảng):

ALTER TABLE `Window` ADD CONSTRAINT `Windows_ibfk_1` FOREIGN KEY (`WallId`) REFERENCES `Wall` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

1

kiểm tra cả hai bảng có cùng một lược đồ InnoDB MyISAM. Tôi đã làm cho tất cả chúng giống nhau trong trường hợp InnoDB của tôi và hoạt động


1

Vấn đề của tôi không được liệt kê, nó là một cái gì đó thật ngớ ngẩn ..... Bảng có FK dạng PK là một tổ hợp PKđược khai báo như thế này: khóa chính ( CNPJ, CEP) Tôi muốn trường CEP nằm FKtrong một bảng khác và tôi đã bị mắc kẹt trong lỗi này, đạo đức của câu chuyện chỉ cần đảo ngược mã ở trên cho khóa Chính ( CEP, CNPJ) và nó đã hoạt động. Nhận tiền boa cho bạn bè của họ.

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.