【问题标题】:Where is the syntax error in this CREATE TABLE statement? [closed]此 CREATE TABLE 语句中的语法错误在哪里? [关闭]
【发布时间】:2012-07-11 23:49:55
【问题描述】:
CREATE TABLE Child (
   chil_id INT AUTO_INCREMENT PRIMARY KEY NOT NULL,
   child_fname VARCHAR(20) NOT NULL,
   child_sname VARCHAR(20) NOT NULL,
   child_dob DATE NOT NULL,
   child_gender ENUM('M','F') DEFAULT 'M',
   parent_id INT NOT NULL),
 CONSTRAINT FOREIGN KEY (parent_id) references Parent (parent_id) )
 ENGINE=InnoDB;

错误信息:

您的 sql 语法有错误。检查对应的手册 到您的 MySQL 服务器版本,以便在 'CONSTRAINT 附近使用正确的语法 FOREIGN KEY(parent_id) 引用 Parent (parent_id) ) ENGINE=InnoDB 在第 8 行

【问题讨论】:

  • 错误信息是什么?为什么你认为这是错误的?
  • 这是错误消息''您的 sql 语法有错误。检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法,以便在 'CONSTRAINT FOREIGN KEY(parent_id) references Parent (parent_id) ) ENGINE=InnoDB at line 8'附近使用
  • 这是 ChildTable 的主表 名称:子属性名称 数据类型 必需 键 child_id INT AUTO_INCREMENT NOT NULL Primary child_fname VARCHAR (20) NOT NULL child_sname VARCHAR (20) NOT NULL child_dob DATE NOT NULL child_gender ENUM ( 'M', 'F') NOT NULL parent_id INT NOT NULL Foreign
  • @Azeezat 请参阅我的答案以了解如何解决此问题。如果答案有帮助,您可以通过单击它旁边的复选标记来接受它。 (当您使用它时,您也可以接受other answers)。

标签: mysql


【解决方案1】:

问题出在这一行:

parent_id INT NOT NULL),

括号关闭列/约束声明,但您在之后包含一个约束,这会引发错误。删除那个括号,你应该被设置。正确的代码应该是这样的:

CREATE TABLE `Parent` (
  `parent_id` INT NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`parent_id`)
  ) Engine=InnoDB;

CREATE TABLE Child (
   chil_id INT AUTO_INCREMENT PRIMARY KEY NOT NULL,
   child_fname VARCHAR(20) NOT NULL,
   child_sname VARCHAR(20) NOT NULL,
   child_dob DATE NOT NULL,
   child_gender ENUM('M','F') DEFAULT 'M',
   parent_id INT NOT NULL,
 CONSTRAINT FOREIGN KEY (parent_id) references Parent (parent_id) )
 ENGINE=InnoDB;

显然,我在猜测Parent 的表结构,因为我只需要一个表来满足parent_id 的外键约束。您可以验证这在fiddle 中是否有效。

最后,你真的应该看看 this answer 标题为“关于如何有条不紊地修复此类错误的更多信息”部分,因为它会大量调试 CREATE TABLE 语句对你来说更容易(正如 before 所建议的那样)。

【讨论】:

    【解决方案2】:

    你有太多的右括号。

    行的最后一个括号

    CONSTRAINT FOREIGN KEY (parent_id) references Parent (parent_id) )

    是多余的。删除它,然后重试。

    【讨论】:

    • 您是否测试过您的解决方案?那个括号不是问题,因为即使删除它,语句仍然失败。
    最近更新 更多