为什么我不能引用主键?

时间:2016-04-10 17:26:11

标签: mysql

前两个表成功通过,但是一旦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)创建为单独的实体,但这似乎不起作用。 谢谢。

2 个答案:

答案 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,因为它只使用一个索引。