2011-09-27 73 views
2

這是SQL:ERROR 1005(HY000):無法創建表 '...... issue.frm'(錯誤:150)

CREATE TABLE user (
    userID INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL, 
    username VARCHAR(100) NOT NULL, 
    isAdmin BOOL NOT NULL DEFAULT 0, 
    canAssignIssue BOOL NOT NULL DEFAULT 0, 
    canMarkDuplicate BOOL NOT NULL DEFAULT 0, 
    canProcessIssue BOOL NOT NULL DEFAULT 0 
) ENGINE = InnoDB; 

CREATE TABLE issue (
    issueID INTEGER UNSIGNED AUTO_INCREMENT NOT NULL, 
    title VARCHAR(100) NOT NULL, 
    body TEXT NOT NULL, 
    duplicateOf INTEGER UNSIGNED DEFAULT NULL, 
    issueDateTime DATETIME NOT NULL, 
    postBy INTEGER UNSIGNED NOT NULL, 
    PRIMARY KEY (issueID, postBy, duplicateOf), 
    INDEX (postBy, duplicateOf), 
    FOREIGN KEY (duplicateOf) REFERENCES issue (issueID) 
     ON DELETE SET NULL, 
    FOREIGN KEY (postBy) REFERENCES user (userID) 
     ON DELETE SET NULL 
) ENGINE = InnoDB; 

我從得到這個錯誤消息上面的代碼:

ERROR 1005 (HY000): Can't create table '......\issue.frm' (errno: 150) 

然而,如果我改變

FOREIGN KEY (duplicateOf) REFERENCES issue (issueID) 
     ON DELETE SET NULL, 

該代碼有效。

+1

可能是這個issueID不能爲NULL。每個'issID INTEGER UNSIGNED AUTO_INCREMENT NOT NULL,'。外鍵應該設置在相同的字段上。 – stslavik

+1

不,如果父記錄被刪除,外鍵可以設置爲空。這不是問題。問題在於OP試圖設置null作爲主鍵的一部分,根據定義它不能爲空。 –

回答

2

我認爲這裏的問題是,您要在問題表中指定列主鍵定義在其父行被刪除的情況下設置爲空。 MySQL不會這樣做,因爲主鍵列不允許包含空值。

對問題表的DDL進行快速調整應該可以讓你做你想做的事情。主鍵和唯一鍵之間的一個關鍵(無意雙關)差異是允許唯一鍵列包含空值。我猜測issueID列是唯一的,因爲它被指定爲AUTO_INCREMENT。請嘗試以下操作:

CREATE TABLE issue (
issueID INTEGER UNSIGNED AUTO_INCREMENT NOT NULL, 
title VARCHAR(100) NOT NULL, 
body TEXT NOT NULL,  
duplicateOf INTEGER UNSIGNED, 
issueDateTime DATETIME NOT NULL, 
postBy INTEGER UNSIGNED NULL, 
PRIMARY KEY (issueID), 
UNIQUE INDEX (issueID,duplicateOf,postBy), 
INDEX (postBy, duplicateOf), 
FOREIGN KEY (duplicateOf) REFERENCES issue (issueID) 
ON DELETE SET NULL, 
FOREIGN KEY (postBy) REFERENCES user (userID) 
ON DELETE SET NULL) 
ENGINE = InnoDB; 

祝你好運!

相關問題