【问题标题】:SQL syntax error on create query创建查询时的 SQL 语法错误
【发布时间】:2013-04-15 04:07:49
【问题描述】:

当我在 phpMyAdmin 和 Sequel 上运行下面的查询时,出现以下错误

#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的“id Int UNSIGNED NOT NULL AUTO_INCREMENT, login Char(128) NOT NULL, passw”附近使用正确的语法。

我无法找出此查询的错误。 Mysql 运行在 5.5.25 版本上。

CREATE TABLE user
(
  id Int UNSIGNED NOT NULL AUTO_INCREMENT,
  login Char(128) NOT NULL,
  password Char(128) NOT NULL,
  emailaddress Char(128),
  alternateemailaddress Char(128),
  officephone Char(20),
  officefax Char(20),
  mobilephone Char(20),
  client Int UNSIGNED,
  facility Int UNSIGNED,
  user_status Int UNSIGNED NOT NULL DEFAULT 0,
  valid_from Datetime NOT NULL,
  valid_to Datetime NOT NULL,
  last_login Datetime,
  last_login_from Char(48),
  modified_by Int NOT NULL,
  modified_time Datetime,

  PRIMARY KEY (id),
  FOREIGN KEY client REFERENCES client (id) ON DELETE CASCADE,
  FOREIGN KEY facility REFERENCES facility (id) ON DELETE CASCADE
 
 ) ENGINE = InnoDB
  AUTO_INCREMENT = 0
;

【问题讨论】:

  • 相同的查询,但在 mysql 中没有错误 :)
  • @TheUnlucky 我认为错误是由复制查询引起的。可能有一些隐藏的字符或空格。我尝试从这篇文章中复制查询,但它仍然返回一个错误,这次在引用上出现不同的错误。现在当我删除外键时很好。感谢您确认查询。

标签: mysql create-table


【解决方案1】:

你应该在写表和字段的名字时使用 backsticks 以避免 MySQL 将其解析为保留关键字。 您还应该使用括号包裹您的外键名称。 工作查询应如下所示:

CREATE TABLE `user`
(
  `id` Int UNSIGNED NOT NULL AUTO_INCREMENT,
  `login` Char(128) NOT NULL,
  `password` Char(128) NOT NULL,
  `emailaddress` Char(128),
  `alternateemailaddress` Char(128),
  `officephone` Char(20),
  `officefax` Char(20),
  `mobilephone` Char(20),
  `client` Int UNSIGNED,
  `facility` Int UNSIGNED,
  `user_status` Int UNSIGNED NOT NULL DEFAULT 0,
  `valid_from` Datetime NOT NULL,
  `valid_to` Datetime NOT NULL,
  `last_login` Datetime,
  `last_login_from` Char(48),
  `modified_by` Int NOT NULL,
  `modified_time` Datetime,

  PRIMARY KEY (`id`),
  FOREIGN KEY (`client`) REFERENCES `client` (`id`) ON DELETE CASCADE,
  FOREIGN KEY (`facility`) REFERENCES `facility` (`id`) ON DELETE CASCADE

 ) ENGINE = InnoDB
  AUTO_INCREMENT = 0
;

【讨论】:

  • 感谢您的建议。我确实删除了我创建的表以检查查询是否适用于引用。当我复制并执行您的查询时,我收到此错误“无法创建表 'portal.user' (errno: 150)。”
  • 在引用表还没有创建的时候添加外键可以吗?
  • 我认为 clientfacility 中的 id 字段没有 UNSIGNED 属性。尝试从我的创建查询变体中的 clientfacility 字段中删除 UNSIGNED,您会发现它会起作用。
  • 此查询不需要反引号 - 请参阅我的 sqlfiddle 证明。
  • 我并不是说后援键是必要的,但应该在字段和表名中的任何地方使用它以避免保留字的一些问题。主要是引用表中的字段提供的类型错误。
【解决方案2】:

这对我有用。
看我成功的SQLFiddle

我怀疑您的输入中有一些奇怪的空白字符,可能是制表符。

【讨论】:

  • 查询部分为空,但架构(表创建)构建正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 2018-09-12
  • 2016-03-25
  • 1970-01-01
相关资源
最近更新 更多