前两个表成功通过,但是一旦mysql检查程序到达第三个表,它就会通知我引用键存在问题。 这是我的代码:
CREATE TABLE USER(
Username VARCHAR(20) NOT NULL,
Email VARCHAR(50) NOT NULL,
Picture VARCHAR(30),
Points INT(5) DEFAULT 1 NOT NULL,
Password VARCHAR(50) NOT NULL,
Firstname VARCHAR(25) NOT NULL,
Lastname VARCHAR(25) NOT NULL,
PRIMARY KEY(Username)
);
CREATE TABLE THREAD (
ThreadID INT(9) NOT NULL AUTO_INCREMENT,
Title VARCHAR(255) NOT NULL,
PostID int(9) NOT NULL,
PRIMARY KEY (ThreadID)
);
CREATE TABLE POST(
ThreadID INT(9) NOT NULL,
PostID INT(9) NOT NULL AUTO_INCREMENT,
Content TEXT NOT NULL,
NumberOfLines INT(5) NOT NULL,
PRIMARY KEY(ThreadID, PostID),
FOREIGN KEY ThreadID(ThreadID) REFERENCES THREAD(ThreadID)
);
我得到的错误如下:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '
PRIMARY KEY(ThreadID, PostID),
FOREIGN KEY fk_ThreadID(ThreadID) REFE' at line 6
我尝试将PRIMARY KEY(ThreadID, PostID)
创建为单独的实体,但这似乎不起作用。
谢谢。
答案 0 :(得分:1)
添加到@Schwern,由于错误使用主键而导致错误。下面的创建表将起作用。
create table a (
id bigint(20) NOT NULL AUTO_INCREMENT,
col2 varchar(10), primary key (id, col2)
) engine=innodb;
因此,自动增量列必须是主键中的第一个。
我们已广泛使用这种主键将col2上的表分区 - 列上的范围分区,该列必须是主键的一部分。
另外,您可以以额外索引
为代价获得额外的唯一密钥答案 1 :(得分:0)
MySQL并没有非常丰富的信息。 SQLFiddle直截了当。
表定义不正确;只能有一个自动列,必须将其定义为键
你不能有一个多列密钥,其中一个是 AUTO_INCREMENT
AUTO_INCREMENT
列必须是InnoDB表中多列密钥的第一列。从AUTO_INCREMENT
删除PostID
,或PostID
单独PRIMARY KEY
,并保护帖子不会在UNIQUE(ThreadID, PostID)
两次出现在同一个帖子中。
CREATE TABLE POST(
PostID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
ThreadID INT NOT NULL REFERENCES Thread(ThreadID),
Content TEXT NOT NULL,
NumberOfLines INT NOT NULL,
UNIQUE(ThreadID, PostID)
);
更新:最佳答案是@georgecj11's to put PostID first in the key,因为它只使用一个索引。