这个mysql查询有什么问题?

时间:2011-03-19 15:48:39

标签: mysql sql mysql-error-1075

这有效:

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 - 表定义不正确;只能有一个自动列,必须将其定义为键

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

6 个答案:

答案 0 :(得分:7)

引用Bug #45987, ERROR 1075 (42000): Incorrect table definition

  

实际上,这不是服务器错误,只是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语句。

答案 1 :(得分:1)

嗯,我不是mysql专家,但是

shout_id INT UNSIGNED NOT NULL AUTO_INCREMENT

是自动增量,未定义为Key ....

鉴于我们在此业务中遇到的许多不清楚或误导性的错误消息,我无法想象更清晰的错误消息....

答案 2 :(得分:1)

+1使用无符号等..但是你说...它可以不是null ...但是默认情况下它的0 ..而对我来说0总是为空?和auto_increment的主键是NEVER null .. 你很好的方向,但这样做:

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;

答案 3 :(得分: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)
);

答案 4 :(得分: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。

很高兴看到你使用无符号整数数据类型而没有指定愚蠢的可选显示宽度!!

答案 5 :(得分:1)

这个错误不能简洁地解释这个吗? AUTO_INCREMENT列(如果有的话)必须是键列。

正如您所展示的那样,这样做可以解决问题。