【问题标题】:Alter table to give foreign key constraint更改表以提供外键约束
【发布时间】:2012-02-27 19:53:12
【问题描述】:

我有一个包含 2 列的表,我从两个不同的表中复制了这些列。我现在要做的是对列名 email 和 id 给出一个外键约束,如下所示。

ALTER TABLE users_role_map
ADD CONSTRAINT FK_users_role_map
FOREIGN KEY (email) REFERENCES usert(email),
FOREIGN KEY (id) REFERENCES rolet(id)
ON UPDATE CASCADE
ON DELETE CASCADE;

我收到以下错误:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'FOREI
GN KEY (id) REFERENCES rolet(id)
ON UPDATE CASCADE
ON DELETE CASCADE' at line 4

【问题讨论】:

    标签: mysql mysql-error-1064


    【解决方案1】:

    您不是在此语句中添加约束,而是添加 constraints:两个 FOREIGN KEY 子句中的每一个都意味着一个单独的约束。尽管如此,根据manual,您应该能够根据需要在单个 ALTER TABLE 语句中添加尽可能多的外键约束。您只需要在每个约束之前包含ADD

    请注意,约束名称单独应用于您正在添加的约束,因此如果您希望第二个外键具有特定名称,您可能需要为第二个外键指定 CONSTRAINT <i>name</i>。与ON UPDATE/ON DELETE 相同:它们适用于直接位于它们之前的外键。

    因此,更正后的语句可能如下所示:

    ALTER TABLE users_role_map
    
    ADD CONSTRAINT FK_users_role_map1
    FOREIGN KEY (email) REFERENCES usert(email)
    ON UPDATE CASCADE
    ON DELETE CASCADE,
    
    ADD CONSTRAINT FK_users_role_map2
    FOREIGN KEY (id) REFERENCES rolet(id)
    ON UPDATE CASCADE
    ON DELETE CASCADE;
    

    【讨论】:

    • 这看起来是正确的。根据我的经验,我什至不手动命名约束或索引,我让 MySQL 在幕后处理它。
    • 是的,命名是可选的。在 SQL Server 中,它也是可选的,不过我更喜欢指定名称。
    • 我得到了错误。错误 1005 (HY000): 无法创建表 'acsuserdatabase_dbo.#sql-984_10e' (errno : 150)
    • @luckysing_noobster:来自manual1005 (ER_CANT_CREATE_TABLE)无法创建表。如果错误消息涉及错误 150,则表创建失败,因为未正确形成外键约束。” – 可能是外键列之一中的无效引用?
    • @MikePurcell:我倾向于为外键选择一个名称,以便随时随地查看外键引用的内容。例如,在外键违规错误的情况下,违规键的名称会显示在错误消息中。此外,我可以通过查看表的外键列表来判断是否在表上定义了特定的外键。当我需要删除一个现有的键时,通常很容易使用既定的命名规则找出它的名称。
    猜你喜欢
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    相关资源
    最近更新 更多