这个MySQL查询有什么问题?

4

这是有效的:

CREATE TABLE shoutbox_shout (
  shout_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  user_id INT UNSIGNED NOT NULL DEFAULT 0,
  shout_date INT UNSIGNED NOT NULL DEFAULT 0,
  message MEDIUMTEXT NOT NULL,
  KEY shout_date (shout_date)
)

...而这个:

CREATE TABLE shoutbox_shout (
  shout_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  user_id INT UNSIGNED NOT NULL DEFAULT 0,
  shout_date INT UNSIGNED NOT NULL DEFAULT 0,
  message MEDIUMTEXT NOT NULL,
  KEY shout_date (shout_date)
)

...结果是:

错误代码:1075 - 不正确的表定义;只能有一个自动列,并且必须定义为键

我添加了主键但仍然出现错误。


1
你能提供具体的错误文本吗? - JohnFx
你的代码在这里运行正常。使用phpmyadmin通过mysql 5.0.5。 - canadiancreed
我尝试运行这个程序时没有出现任何错误,只有当我删除“primary key”时才能重现错误,就像你说的一样。很奇怪。 - Joris Ooms
对我来说没问题(mysql 5.1.36,从shell中),也可以。 - ax.
一位版主编辑了我的原始帖子。 - BRampersad
显示剩余3条评论
6个回答

7

引用Bug #45987,ERROR 1075(42000):表定义不正确

实际上,这不是服务器错误,而是MyISAM(假定为该手册页面的默认值)和在其他地方记录的InnoDB存储引擎之间的差异:http://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.html

MyISAM不再是默认引擎,InnoDB是。

此外:http://bugs.mysql.com/bug.php?id=60104

结论

InnoDB不支持未为表定义主键但具有AUTO_INCREMENT属性,但MyISAM支持。选择要使用的引擎(MyISAM或InnoDB),然后相应处理CREATE TABLE语句即可。


这可以解释它。谢谢。 - BRampersad

1
+1 使用无符号等等,但是你说...它可以不为空...但默认为0...对我来说0始终为空?而自动递增的主键永远不为空... 你的方向很好,但要这样做:
create table shoutbox_shout (
    shout_id int unsigned auto_increment primary key,
    user_id int unsigned not null,
    shout_date datetime,
    message mediumtest not null
)engine=innodb;

1

@Brandon_R:我在使用MySQL 5.0.67-community-nt的命令行时遇到了同样的错误,但是使用以下代码可以解决问题 --

CREATE TABLE shoutbox_shout (
  shout_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  user_id INT UNSIGNED NOT NULL DEFAULT 0,
  shout_date INT UNSIGNED NOT NULL DEFAULT 0,
  message MEDIUMTEXT NOT NULL,
  KEY shout_date (shout_date),
  PRIMARY KEY (shout_id)
);

1

你必须将auto_increment列定义为主键/键。

CREATE TABLE shoutbox_shout (
  shout_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  user_id INT UNSIGNED NOT NULL DEFAULT 0,
  shout_date INT UNSIGNED NOT NULL DEFAULT 0,
  message MEDIUMTEXT NOT NULL,
  KEY shout_date (shout_date),
  primary key (shout_id) -- primary key
)

或者

CREATE TABLE shoutbox_shout (
  shout_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  user_id INT UNSIGNED NOT NULL DEFAULT 0,
  shout_date INT UNSIGNED NOT NULL DEFAULT 0,
  message MEDIUMTEXT NOT NULL,
  KEY shout_date (shout_date),
  key (shout_id) -- key
)

你应该定义你的引擎类型 - 我建议使用InnoDB。

很高兴看到您在未指定可选显示宽度的情况下使用无符号整数数据类型!!


1

虽然我不是mysql专家,但

shout_id INT UNSIGNED NOT NULL AUTO_INCREMENT

是一个自动递增的值,没有定义为关键字....

考虑到我们在这个行业中经常遇到的许多不清楚或误导性的错误消息,我无法想象有比这更清晰的错误消息了....


1

这个错误难道没有简明扼要地解释吗?如果你有 AUTO_INCREMENT 列,它必须是一个关键列。

正如你所展示的那样,将其设置为关键列可以解决问题。


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