【问题标题】:Syntax error when adding foreign key constraint添加外键约束时出现语法错误
【发布时间】:2017-04-13 18:34:34
【问题描述】:

我正在尝试为type_id 列设置DEFAULT 值和NOT NULL,这是instance 表的外键,但它抱怨MySQL 语法。

CREATE TABLE `type` (
  `id` int(10) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `city` varchar(256)
); 

ALTER TABLE instance ADD COLUMN type_id int(10) unsigned NOT NULL;

ALTER TABLE instance ADD CONSTRAINT instance_xbf1 DEFAULT 1
FOREIGN KEY (type_id)
REFERENCES type(id) int(10) unsigned NOT NULL;

它在抱怨最后一条语句的语法:

错误:\“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本对应的手册,以了解在 'DEFAULT 1\nFOREIGN KEY (type_id)\nREFERENCES type(id) int( 10) unsi' 在第 1 行\")", "stdout": "", "stdout_lines": [], "warnings": []}

【问题讨论】:

  • 实际的错误信息是什么?
  • it is complaining about mysql syntax 这些投诉包含非常具体的消息,可以准确地告诉您错误是什么。

标签: mysql sql constraints database-schema ddl


【解决方案1】:

您试图在 ADD CONSTRAINT 语句中为外键做太多事情。

您可以通过两种方式添加默认值。作为列定义的一部分:

ALTER TABLE instance ADD COLUMN type_id int(10) unsigned NOT NULL DEFAULT 1;

或稍后在它自己的声明中:

ALTER TABLE instance ALTER type_id SET DEFAULT 1;

在外键中你不能定义列的属性,例如数据类型、可空性、默认值等...

错误消息告诉您它不希望 DEFAULT 关键字作为 ADD CONSTRAINT 的一部分。如果您删除它,它将抱怨数据类型和可空性部分:int(10) unsigned NOT NULL,因为它也不期待这些。但是无论如何,您已经定义了它们。

因此,您的ADD CONSTRAINT 可以简化为:

ALTER TABLE instance ADD CONSTRAINT instance_xbf1
FOREIGN KEY (type_id) REFERENCES type(id);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多