Domanda

Ho il seguente script per creare una tabella in MySQL versione 5.1 che deve fare riferimento ad altre 3 tabelle. Tutte e 3 le tabelle sono state create utilizzando InnoDB e tutte e 3 le tabelle hanno la colonna ID definita come INT.

Ho creato con successo altre tabelle che fanno riferimento a ACCOUNT e PERSON, tuttavia, questa è la prima tabella che fa riferimento a ADDRESS, quindi ho incluso la definizione per quella tabella, come sotto, anche sotto.

L'errore che sto ricevendo è ERRORE 1005 (HY000) con errno 150, che intendo sia relativo alla creazione di chiave esterna.

Lo script che fallisce è (colonne extra rimosse per semplicità):

CREATE TABLE WORK_ORDER (
    ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ACCOUNT_ID INT NOT NULL,
    CUSTOMER_ID INT NOT NULL,
    SALES_ID INT,
    TRADES_ID INT,
    LOCATION_ID INT NOT NULL,
    INDEX CUST_INDEX(CUSTOMER_ID),
    INDEX SALES_INDEX(SALES_ID),
    INDEX TRADES_INDEX(TRADES_ID),
    INDEX ACCOUNT_INDEX(ACCOUNT_ID),
    INDEX LOCATION_INDEX(LOCATION_ID),
    FOREIGN KEY (CUSTOMER_ID) REFERENCES PERSON(ID) ON DELETE CASCADE,
    FOREIGN KEY (SALES_ID) REFERENCES PERSON(ID) ON DELETE SET NULL,
    FOREIGN KEY (TRADES_ID) REFERENCES PERSON(ID) ON DELETE SET NULL,
    FOREIGN KEY (ACCOUNT_ID) REFERENCES ACCOUNT(ID) ON DELETE CASCADE,
    FOREIGN KEY (LOCATION_ID) REFERENCES ADDRESS(ID) ON DELETE SET NULL
) ENGINE=InnoDB;

L'istruzione SQL utilizzata per creare la tabella ADDRESS è di seguito (colonne extra rimosse per semplicità).

CREATE TABLE ADDRESS (
    ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    PERSON_ID INT NOT NULL,
    ACCOUNT_ID INT NOT NULL,
    ADDRESS_L1 VARCHAR(50),
    ADDRESS_L2 VARCHAR(50),
    CITY VARCHAR(25),
    PROVINCE VARCHAR(20),
    POSTAL_CODE VARCHAR(6),
    COUNTRY VARCHAR(25),
    INDEX CUST_INDEX(PERSON_ID),
    INDEX ACCOUNT_INDEX(ACCOUNT_ID),
    FOREIGN KEY (ACCOUNT_ID) REFERENCES ACCOUNT(ID) ON DELETE CASCADE,
    FOREIGN KEY (PERSON_ID) REFERENCES PERSON(ID) ON DELETE CASCADE
) ENGINE=InnoDB;

Ho sfogliato qui diverse domande che trattano di problemi simili, ma la maggior parte sembra essere definizioni duplicate e tipi di campi non corrispondenti, così come alcuni che non usano InnoDB per l'una o l'altra delle tabelle. Tuttavia, nessuno di questi sembra essere il problema. Qualche idea?

È stato utile?

Soluzione

Puoi sempre emettere un comando 'SHOW ENGINE INNODB STATUS'. Sepolto nell'output sarà un "ULTIMO ERRORE CHIAVE ESTERO" sezione, che avrà maggiori dettagli su cosa ha causato l'errore "150":

mysql> create table a (x int not null) type=innodb;
Query OK, 0 rows affected, 1 warning (0.02 sec)

mysql> create table b (y int not null, foreign key (y) references a (x) on delete set null) type=innodb;
ERROR 1005 (HY000): Can't create table './test/b.frm' (errno: 150)

mysql> show engine innodb status;
[..... snip snip snip ...]
------------------------
LATEST FOREIGN KEY ERROR
------------------------
091129 16:32:41 Error in foreign key constraint of table test/b:
foreign key (y) references a (x) on delete set null) type=innodb:
You have defined a SET NULL condition though some of the
columns are defined as NOT NULL.
[.... snip snip snip ...]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top