2011-09-27 2 views
2

Ceci est le SQL:erreur 1005 (HY000): Impossible de créer la table '...... issue.frm' (errno: 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; 

J'ai reçu ce message d'erreur de la code ci-dessus:

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

Cependant, si je change

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

à

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

le code fonctionne.

+1

Il est probable que l'ID de problème ne peut pas être NULL. par 'issueID INTEGER UNSIGNED AUTO_INCREMENT NON NULL,'. Les clés étrangères doivent être définies sur des champs identiques. – stslavik

+1

Non, les clés étrangères peuvent être définies comme nul si l'enregistrement parent est supprimé. Ce n'est pas le problème. Le problème est que l'OP essaye de mettre à zéro un champ qui fait partie de la clé primaire, qui par définition ne peut jamais être nul. –

Répondre

2

Je pense que le problème ici est que vous spécifiez des colonnes dans votre table de problème définition de la clé primaire à définir sur null en cas de suppression de leur ligne parente. MySQL n'aimerait pas cela car les colonnes de clé primaire ne sont pas autorisées à contenir des valeurs nulles. Une modification rapide du DDL de la table des problèmes devrait vous permettre de faire ce que vous voulez. L'une des différences clés (sans jeu de mots) entre une clé primaire et une clé unique est que les colonnes de clé uniques sont autorisées à contenir des valeurs nulles. Je suppose que la colonne issueID sera aussi unique étant donné qu'elle est spécifiée comme AUTO_INCREMENT. Essayez ce qui suit:

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; 

Bonne chance!

Questions connexes