2010-02-23 2 views
9
mysql> ALTER TABLE category ADD CONSTRAINT category_parent_category_id FOREIGN KEY (parent) REFERENCES category(id); 
ERROR 1005 (HY000): Can't create table 'sfnews.#sql-244_1' (errno: 150) 

DDL come segue:MySQL chiave esterna allo stesso tavolo con l'errore 1005, errno 150

Create Table: CREATE TABLE `category` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL, 
    `parent` bigint(20) unsigned DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `name` (`name`), 
    KEY `parent_idx` (`parent`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

Perché è sbagliato?

risposta

11

L'autoferenza deve essere possibile. È perché "genitore" non è firmato e "id" non lo è. Modificare la colonna id definizioni tabella su

`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 

e funzionerà.

I reference Uniti circa chiavi esterne: "La dimensione e il segno di tipi interi devono essere gli stessi"

sembra essere lo stesso problema descritto here

1

Se si controlla lo stato del motore InnoDB (SHOW ENGINE InnoDB STATUS), si otterrà una spiegazione più completa:

ULTIME FOREIGN KEY ERROR

[...]

Impossibile trovare un indice nella tabella di riferimento in cui le colonne di riferimento vengono visualizzate come prime colonne o tipi di colonna nella tabella e la tabella di riferimento non corrisponde per il vincolo.

Fai id senza segno.