2012-04-29 16 views
12

Pregunta:

¿Por qué recibo errores al intentar modificar una tabla con una restricción de clave externa?tabla MySQL añadir restricción de clave externa conduce a errores

Detalles:

tengo 1 mesa, HSTORY que utilizo como una tabla de base para todas las demás tablas de la historia específica (es decir USER_HISTORY, BROWSER_HISTORY, PICTURE_HISTORY ....). También incluí las tablas PICTURE y USER a medida que reciban llamadas.

tabla de historia:

CREATE TABLE IF NOT EXISTS HISTORY 
(
    ID  INT NOT NULL AUTO_INCREMENT, 
    VIEWERID INT NOT NULL , 
    VIEWDATE TIMESTAMP NOT NULL DEFAULT NOW(), 

    PRIMARY KEY (ID), 
    FOREIGN KEY (VIEWERID) REFERENCES USER(ID) 
) 
engine=innodb; 

tabla de usuario: (por si alguien tiene curiosidad)

CREATE TABLE IF NOT EXISTS USER 
(
    ID  INT NOT NULL AUTO_INCREMENT, 

    PRIMARY KEY (ID) 
) 
engine=innodb; 

mesa IMAGEN: (por si alguien tiene curiosidad)

CREATE TABLE IF NOT EXISTS PICTURE 
(
    ID  INT NOT NULL AUTO_INCREMENT, 

    PRIMARY KEY (ID) 
) 
engine=innodb; 
tabla

PICTURE_HISTORY:

CREATE TABLE IF NOT EXISTS PICTURE_HISTORY LIKE HISTORY; 

ALTER TABLE PICTURE_HISTORY 
ADD FOREIGN KEY (FOREIGNID) REFERENCES PICTURE(ID); 

Sin embargo, cuando hago esto, me sale:

Key column 'FOREIGNID' doesn't exist in table 

tomo esto como que tengo que crear primero FOREIGNID, pero en muchos de los ejemplos en SO, lo anterior debería funcionar. Alguien sabe por qué esto está ocurriendo?

+1

Me gustaría ver un ejemplo en el eso debería funcionar ... No funcionará a menos que 'FOREIGNID' ya exista. No puede crear una columna simplemente creando una restricción que la use. –

+0

@Michael tendría que emitir dos instrucciones de modificación (una para crear 'FOREGINID' y otra para convertirla en FOREIGN KEY' o puedo hacerlo de una vez? – puk

+0

No estoy seguro - Nunca lo he intentado, así que no No sé si se quejará si intenta una afirmación. Solo pruébela: 'ALTER TABLE PICTURE_HISTORY ADD FOREIGNID INT NOT NULL ADD CONSTRAINT fk_pictureid FOREIGN KEY (FOREIGNID) REFERENCES PICTURE (ID);' –

Respuesta

23

Gracias a Michael por señalar mi error. No puedo hacer una clave externa a menos que la columna ya exista. Si en lugar expido estos dos comandos, se crea la restricción de clave externa:

ALTER TABLE PICTURE_HISTORY 
ADD COLUMN FOREIGNID INT NOT NULL; 

ALTER TABLE PICTURE_HISTORY 
ADD FOREIGN KEY (FOREIGNID) REFERENCES PICTURE(ID); 
8

Se pueden combinar comandos de MySQL usando una coma, así:

ALTER TABLE PICTURE_HISTORY 
ADD COLUMN FOREIGNID INT NOT NULL, 
ADD FOREIGN KEY (FOREIGNID) REFERENCES PICTURE(ID); 
+0

aunque técnicamente no es una respuesta a mi pregunta original, gracias por la sugerencia, sin embargo, – puk

+0

alter table rooms agregar column productid int not null, add foreign key (productid) hace referencia al stock (productid) en delete cascade); esto no funcionó – VijayaRagavan

Cuestiones relacionadas