修改MySQL表以添加外键约束会导致错误。

13

问题:

为什么在尝试更改具有外键约束的表时会出现错误?

细节:

我有一个名为 HSTORY 的表,我将其用作所有其他特定历史记录表(即 USER_HISTORYBROWSER_HISTORYPICTURE_HISTORY 等)的基础表。 我还包括了 PICTUREUSER 表,因为它们也被调用。

历史记录表:

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;

用户表:(如果有人感兴趣的话)

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

   PRIMARY KEY (ID)
)
engine=innodb;

图片表格:(如果有人感兴趣的话)

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已经存在,否则它不会起作用。你不能仅通过创建使用它的约束来创建一个列。 - Michael Berkowski
@Michael 我需要发出两个 ALTER 语句(一个用于创建 FOREGINID,另一个将其设置为 FOREIGN KEY),还是可以一次性完成? - puk
我不确定 - 我从未尝试过,所以不知道如果您尝试一个语句是否会出错。只需尝试一下:ALTER TABLE PICTURE_HISTORY ADD FOREIGNID INT NOT NULL ADD CONSTRAINT fk_pictureid FOREIGN KEY (FOREIGNID) REFERENCES PICTURE (ID); - Michael Berkowski
2个回答

26

感谢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);

虽然这并不是对我最初问题的技术性回答,但还是感谢你的提示。 - puk
修改表rooms,添加列productid int not null,并添加外键(productid)参照stock表的(productid)进行级联删除。这个没有成功。 - VijayaRagavan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接