2016-04-10 9 views
0

最初の2つのテーブルは正常に通過しますが、mysqlチェッカーが3番目のテーブルに到達するとすぐに、参照キーに問題があることが通知されます。ここで が私のコードです:私は取得していますプライマリキーを参照できないのはなぜですか?

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

の費用で追加の一意のキーを達成することができます私はあなたがFOREIGN KEYの部分でフロントOG parantesisでのThreadIDを設定すると思ういけません。 –

+0

@MattiasÅslundできます。インデックスのオプションの名前です。 – Schwern

+0

このエラーメッセージがそのコードに属していることを確認してください...? SQLfiddleでテストすると、別のものが得られます:_ "不正なテーブル定義です。自動列が1つしかなく、キーとして定義する必要があります "_ – CBroe

答えて

0

MySQLにはあまり情報がありません。 SQLFiddleはそれを真似します。

テーブル定義が正しくありません。そこに一つだけのオート列にすることができ、あなたがそれらのいずれかがAUTO_INCREMENTAUTO_INCREMENT列が複数列の最初でなければなりません複数列のキーを持つことはできませんキー

として定義する必要がありますInnoDBテーブルのキー。 PostIDから AUTO_INCREMENTを削除するか、 PRIMARY KEYだけを PostIDにして、同じスレッドに投稿が UNIQUE(ThreadID, PostID)で2回表示されないようにしてください。

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です。

+0

これは完全に機能しました – abedzantout

+1

マルチ列の主キーにはまだAUTOインクリメントがあります: create table a(id bigint(20)NOT NULL AUTO_INCREMENT、col2 varchar(10)、主キー(id、col2))エンジン= innodb; – georgecj11

+0

@ georgecj11あなたは正しいです、そして、余分なインデックスを追加しないのであなたの答えは受け入れられるべきです。 – Schwern

1

@Schwernに追加すると、プライマリキーの間違った使用のためにエラーが発生します。以下のテーブルを作成すると動作します。

create table a ( 
    id bigint(20) NOT NULL AUTO_INCREMENT, 
    col2 varchar(10), primary key (id, col2) 
) engine=innodb; 

したがって、自動増分列は主キーの最初のものである必要があります。

私たちは、この種の主キーをcol2でパーティション化するために広く使用しました。つまり、列の範囲パーティションには、その列を主キーの一部にする必要があります。

も言及し、あなたは余分なインデックス

+0

"このテーブルに1つのキーをそのまま残しておきたい場合は、"自動インクリメント列がプライマリキーの最初のものである必要があります "。しかし、一般的に、 'auto_increment'は、コンポジットAとは無関係なキーである限り、最も左ではないコンポジットAの一部である可能性があります。 – Drew

関連する問題