ОШИБКА 1005 (HY000): не удается создать таблицу '...... \ issue.frm' (номер ошибки: 150) - PullRequest
2 голосов
/ 27 сентября 2011

Это SQL:

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,

до

    FOREIGN KEY (duplicateOf) REFERENCES issue (issueID)
        ON DELETE NO ACTION,

код работает.

1 Ответ

2 голосов
/ 27 сентября 2011

Я считаю, что проблема заключается в том, что вы указываете столбцы в таблице проблем определение первичного ключа , которое должно быть установлено в значение null в случае удаления родительской строки.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;

Удачи!

...