2012-04-29 4 views
12

Вопрос:

Почему я получаю сообщение об ошибке при попытке изменить таблицу с ограничением внешнего ключа?изменяющего MySQL таблицы добавить ограничение внешнего ключа приводит к ошибкам

Деталь:

У меня есть 1 стол, HSTORY который я использую в качестве базовой таблицы для всех остальных таблиц конкретных историй (т.е. USER_HISTORY, BROWSER_HISTORY, PICTURE_HISTORY ....). Я также включил таблицы PICTURE и USER, так как они также называются.

ИСТОРИЯ стол:

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; 

таблица USER: (в случае, если кому-то интересно)

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

    PRIMARY KEY (ID) 
) 
engine=innodb; 

стол PICTURE: (в случае, если кому-то интересно)

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

    PRIMARY KEY (ID) 
) 
engine=innodb; 

PICTURE_HISTORY стол:

CREATE TABLE IF NOT EXISTS PICTURE_HISTORY LIKE HISTORY; 

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

Однако, когда я делаю это, я получаю:

Key column 'FOREIGNID' doesn't exist in table 

Я беру это означает, что я должен сначала создать FOREIGNID, но во многих примерах на SO, вышеуказанное должно работать. Кто-нибудь знает, почему это происходит?

+1

Я хотел бы видеть пример, где это должно работать ... Это не сработает, если 'FOREIGNID' уже существует. Вы не можете создать столбец, просто создав ограничение, которое его использует. –

+0

@ Michael мне пришлось бы выпустить два предложения alter (один для создания 'FOREGINID', а другой - для FOREIGN KEY', или я могу сделать это за один раз? – puk

+0

На самом деле не уверен - я никогда не пробовал, поэтому я не знаю, будет ли он жаловаться, если вы попытаетесь выполнить одно утверждение. Просто попробуйте: «ALTER TABLE PICTURE_HISTORY ADD FOREIGNID INT NOT NULL ADD CONSTRAINT fk_pictureid FOREIGN KEY (FOREIGNID) ССЫЛКИ ИЗОБРАЖЕНИЕ (ID);' –

ответ

23

Благодаря Michael для указания моей ошибки. Я не могу сделать внешний ключ, если столбец уже не существует. Если вместо этого я выполняю эти две команды, ограничение внешнего ключа создается:

ALTER TABLE PICTURE_HISTORY 
ADD COLUMN FOREIGNID INT NOT NULL; 

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

Вы можете комбинировать команды для MySQL через запятую, например:

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

, хотя и не является технически ответом на мой оригинальный вопрос, спасибо за отзыв, тем не менее – puk

+0

alter table rooms добавить столбец productid int not null, добавить внешний ключ (productid) reference stock (productid) при удалении каскада); это не сработало. – VijayaRagavan

Смежные вопросы