2012-04-05 74 views
178

Tôi muốn thêm khóa ngoại vào bảng có tên là "katalog".Thêm khóa ngoại vào bảng hiện có

ALTER TABLE katalog 
ADD CONSTRAINT `fk_katalog_sprache` 
FOREIGN KEY (`Sprache`) 
REFERENCES `Sprache` (`ID`) 
ON DELETE SET NULL 
ON UPDATE SET NULL; 

Khi tôi cố gắng để làm điều này, tôi nhận được thông báo lỗi này:

Error Code: 1005. Can't create table 'mytable.#sql-7fb1_7d3a' (errno: 150) 

Lỗi trong tình trạng InnoDB:

120405 14:02:57 Lỗi trong ràng buộc khóa ngoài của bảng mytable. # sql-7fb1_7d3a:

FOREIGN KEY (`Sprache`) 
REFERENCES `Sprache` (`ID`) 
ON DELETE SET NULL 
ON UPDATE SET NULL: 
Cannot resolve table name close to: 
(`ID`) 
ON DELETE SET NULL 
ON UPDATE SET NULL 

Khi tôi sử dụng truy vấn này nó hoạt động, nhưng với sai "về xóa" hành động:

ALTER TABLE `katalog` 
ADD FOREIGN KEY (`Sprache`) REFERENCES `sprache` (`ID`) 

Cả hai bảng là InnoDB và cả hai lĩnh vực là "INT (11) không phải null". Tôi đang sử dụng MySQL 5.1.61. Đang cố gắng kích hoạt truy vấn ALTER này bằng MySQL Workbench (mới nhất) trên MacBook Pro.

Bảng Tạo câu lệnh:

CREATE TABLE `katalog` (
`ID` int(11) unsigned NOT NULL AUTO_INCREMENT, 
`Name` varchar(50) COLLATE utf8_unicode_ci NOT NULL, 
`AnzahlSeiten` int(4) unsigned NOT NULL, 
`Sprache` int(11) NOT NULL, 
PRIMARY KEY (`ID`), 
UNIQUE KEY `katalogname_uq` (`Name`) 
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC$$ 

CREATE TABLE `sprache` (
`ID` int(11) NOT NULL AUTO_INCREMENT, 
`Bezeichnung` varchar(45) NOT NULL, 
PRIMARY KEY (`ID`), 
UNIQUE KEY `Bezeichnung_UNIQUE` (`Bezeichnung`), 
KEY `ix_sprache_id` (`ID`) 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 
+1

Vì bạn không đăng đầu ra của 'HIỂN THỊ TẠO TABLE', tôi chỉ có thể hỏi - là tên cột thực sự là ID, được viết hoa? –

+0

Tôi đã thêm điều này ở trên. – frgtv10

+0

Vâng, nó dễ dàng hơn để phát hiện ngay bây giờ - 'katalog' có' int (11) unsigned'. 'sprache' không có phần' usigned', do đó hai cột không giống nhau. –

Trả lời

314

Để thêm một khóa ngoại (grade_id) đến một bảng hiện có (người dùng), hãy làm theo các bước sau:

ALTER TABLE users ADD grade_id SMALLINT UNSIGNED NOT NULL DEFAULT 0; 
ALTER TABLE users ADD CONSTRAINT fk_grade_id FOREIGN KEY (grade_id) REFERENCES grades(id); 
+7

Lý do giúp tôi hiểu và ghi nhớ. Điều này là do bạn không thể thêm khóa ngoại vào trường không dấu, đúng không? – PixMach

+5

@PixMach, câu trả lời là không. Bạn có thể đã ký số nguyên làm khóa ngoại. Như N.B. lưu ý về câu hỏi, loại và ký hiệu của các trường cần phải khớp. Vì vậy, nếu khóa chính của bạn trong bảng tra cứu là UNSIGNED, thì trường khóa ngoài cũng phải được UNSIGNED. Nếu trường khóa chính được KÝ thì trường khóa ngoài cũng phải được ký. Hãy suy nghĩ về nó theo cách này: bất kỳ cột nào trong một bảng được định nghĩa là trong SHOW CREATE TABLE, nó cần phải có cùng định nghĩa trong bảng khác. –

+1

Lưu ý rằng điều này cũng có thể được thực hiện với một truy vấn duy nhất (có thể tốt hơn trong trường hợp thất bại, vv) –

3

Khi bạn thêm một ràng buộc khoá ngoại vào một bảng sử dụng ALTER TABLE, hãy nhớ để tạo ra các chỉ số cần thiết đầu tiên.

  1. Tạo chỉ số
  2. Alter bảng
+0

Tôi đã tạo chỉ mục cho cả hai. Khi tôi cố gắng chạy tôi nhận được thông báo lỗi tương tự như trước. Khi tôi từ chối "trên xóa trên cập nhật" một phần nó hoạt động nhưng với hành động "xóa" sai;) – frgtv10

+0

@ frgtv10 nhiều khả năng các bảng dữ liệu mâu thuẫn với "về xóa". –

13

kiểm tra liên kết này. Nó đã giúp tôi với errno 150: http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/

Trên đầu của tôi, hai điều cần lưu ý.

  • Chỉ mục khóa ngoài của bạn có phải là tên duy nhất trong toàn bộ cơ sở dữ liệu (# 3 trong danh sách) không?
  • Bạn đang cố gắng đặt bảng PK thành NULL khi cập nhật (# 5 trong danh sách)?

Tôi đoán vấn đề là với NULL được đặt trên bản cập nhật (nếu bộ não của tôi không ở trạng thái ngược ngày hôm nay vì chúng thường xuyên như vậy ...).

Chỉnh sửa: Tôi đã bỏ lỡ các nhận xét về bài đăng gốc của bạn. Các cột int chưa được ký/không được ký hiệu có thể giải quyết trường hợp của bạn. Hy vọng liên kết của tôi sẽ giúp ai đó trong tương lai nghĩ.

10
FOREIGN KEY (`Sprache`) 
REFERENCES `Sprache` (`ID`) 
ON DELETE SET NULL 
ON UPDATE SET NULL; 

Nhưng bảng của bạn có:

CREATE TABLE `katalog` (
`Sprache` int(11) NOT NULL, 

không thể đặt cột Sprache thành NULL vì nó được định nghĩa là NOT NULL.

45

Đơn giản chỉ cần sử dụng truy vấn này, tôi đã cố gắng nó theo kịch bản của tôi và nó hoạt động tốt

ALTER TABLE katalog ADD FOREIGN KEY (`Sprache`) REFERENCES Sprache(`ID`); 
0

thử tất cả trong một truy vấn

ALTER TABLE users ADD grade_id SMALLINT UNSIGNED NOT NULL DEFAULT 0, 
     ADD CONSTRAINT fk_grade_id FOREIGN KEY (grade_id) REFERENCES grades(id); 
9

bước đơn giản ...

ALTER TABLE t_name1 ADD FOREIGN KEY (column_name) REFERENCES t_name2(column_name) 
1

MySQL sẽ thực hiện truy vấn này:

ALTER TABLE `db`.`table1` 
ADD COLUMN `col_table2_fk` INT UNSIGNED NULL, 
ADD INDEX `col_table2_fk_idx` (`col_table2_fk` ASC), 
ADD CONSTRAINT `col_table2_fk1` 
FOREIGN KEY (`col_table2_fk`) 
REFERENCES `db`.`table2` (`table2_id`) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION; 

Chúc mừng!

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