2013-07-17 39 views
23
CREATE DATABASE my_db; 

CREATE TABLE class (classID int NOT NULL AUTO_INCREMENT, 
nameClass varchar(255), 
classLeader varchar(255), 
FOREIGN KEY (classLeader) REFERENCES student(studentID), 
PRIMARY KEY (classID)); 

CREATE TABLE student (studentID int NOT NULL AUTO_INCREMENT, 
lastName varchar(255), 
firstName varchar(255), 
classID int, 
FOREIGN KEY (classID) REFERENCES class(classID), 
PRIMARY KEY (studentID)); 

Tôi đang cố gắng đảm bảo tính nhất quán dữ liệu giữa các bảng bằng cách sử dụng khóa ngoài để DBMS có thể kiểm tra lỗi; tuy nhiên, có vẻ như chúng tôi không thể làm điều đó vì một lý do nào đó. Lỗi là gì và có cách nào khác không? Ngoài ra, khi tôi điền vào một bảng có khóa ngoại, tôi không thể điền vào trường được dành riêng cho khoá ngoại, đúng không? Ngoài ra, là một chìa khóa nước ngoài được coi là một chìa khóa ở tất cả?Mã lỗi: 1215. Không thể thêm ràng buộc khóa ngoài (khóa ngoài)

Trả lời

35

Vấn đề rất có thể là dòng này:

FOREIGN KEY (classLeader) REFERENCES student(studentID), 

Các kiểu dữ liệu của classLeader là VARCHAR (255). Điều đó phải khớp với kiểu dữ liệu của cột được tham chiếu ... student.studentID. Và dĩ nhiên, bảng student phải tồn tại và cột studentID phải tồn tại và cột studentID phải là KEY CHÍNH của bảng học sinh (mặc dù tôi tin rằng MySQL cho phép đây là một KEY UNIQUE, chứ không phải là KEY CHÍNH , hoặc thậm chí chỉ có một chỉ mục trên nó.)

Trong mọi trường hợp, những gì còn thiếu ở đây là sản phẩm từ SHOW CREATE TABLE student;


có một mismatch datatype.

Cột classLeader VARCHAR(255) không được là tham chiếu khóa ngoài cho studentID INT.

Các kiểu dữ liệu của hai cột phải khớp.

+0

TẠO DATABASE my_db3; CREATE TABLE class (classID int NOT NULL AUTO_INCREMENT, nameClass varchar (255), classLeader int, KEY NƯỚC NGOÀI (classLeader) Tài liệu tham khảo học sinh (StudentID), PRIMARY KEY (classID)); HIỂN THỊ CREATE TABLE học sinh (StudentID int NOT NULL AUTO_INCREMENT, lastName varchar (255), firstName varchar (255), classID int, KEY NƯỚC NGOÀI (classID) Tài liệu tham khảo lớp (classID), PRIMARY KEY (StudentID)) ; –

+1

Tôi vẫn gặp lỗi. –

+0

@ GEORGEReed..Nó hữu ích nếu bạn có thể đăng lỗi mà bạn đang gặp phải. – Rohan

7

Bạn đang nhận được lỗi này vì trong FOREIGN KEY (classLeader) REFERENCES student(studentID) datatype của studentIDclassLeader là different.Datatype của cột khóa chính và cột chính nước ngoài phải tương tự.

From MySQL Site:

Corresponding columns in the foreign key and the referenced key must have similar data types. 
The size and sign of integer types must be the same. 
The length of string types need not be the same. 
For nonbinary (character) string columns, the character set and collation must be the same. 
+3

+1 Câu trả lời cho câu hỏi; câu trả lời này xác định vấn đề gây ra lỗi. – spencer7593

+0

Tôi sẽ thêm các cột sử dụng thuộc tính chưa ký cũng có thể gây ra lỗi này. Cả hai cột phải có cùng định nghĩa về chữ ký hoặc chưa ký. –

1

Các lỗi được giải quyết:

Để tạo một khóa ngoại cho một bảng như

CREATE TABLE USERS_SO (
    USERNAME VARCHAR(10) NOT NULL, 
    PASSWORD VARCHAR(32) NOT NULL, 
    ENABLED SMALLINT, 
    PRIMARY KEY (USERNAME) 
); 

Mã dưới này hoạt động tốt

CREATE TABLE AUTHORITIES_SO (
    USERNAME VARCHAR(10) NOT NULL, 
    AUTHORITY VARCHAR(10) NOT NULL, 
    FOREIGN KEY (USERNAME) REFERENCES USERS_SO(USERNAME) 
); 
0

Hãy chắc chắn rằng bạn có một header và footer trong sql bãi nếu không bạn sẽ thấy tất cả các loại lỗi khi khôi phục cơ sở dữ liệu

Tiêu đề nên trông giống như dưới đây -:

/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 
/*!40101 SET @[email protected]@COLLATION_CONNECTION */; 
/*!40101 SET NAMES utf8 */; 
/*!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 */; 

và footer nên trông giống như dưới đây -:

/*!40111 SET [email protected]_SQL_NOTES */; 
/*!40101 SET [email protected]_SQL_MODE */; 
/*!40014 SET [email protected]_FOREIGN_KEY_CHECKS */; 
/*!40101 SET [email protected]_CHARACTER_SET_CLIENT */; 
/*!40101 SET [email protected]_CHARACTER_SET_RESULTS */; 
/*!40101 SET [email protected]_COLLATION_CONNECTION */; 

Hy vọng sẽ giúp trên

Cheers S

0

Đặt điểm tham chiếu cuối của khóa thành 'Duy nhất'

0

Mặc dù đó là câu trả lời muộn, tôi hy vọng nó sẽ giúp ích cho rất ít người.

Tôi gặp phải sự cố tương tự. Nhưng, ở đây các kiểu dữ liệu cũng giống nhau.

Nhưng, khi tôi kiểm tra câu lệnh tạo bảng, tôi thấy rằng một bảng được tạo bằng cách sử dụng công cụ có tên là "MyISAM" và một bảng khác đang sử dụng "InnoDB".

SHOW CREATE TABLE <TABLE NAME> 

Sau đó, tôi đã thay đổi cả bảng động cơ để "InnoDB" và nó làm việc (tôi đã có thể tạo Ngoại Key)

0

Tháo Engine, CHARSET, COLLATE từ truy vấn, sau đó kiểm tra. Nó làm việc cho tôi.

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