Что не так с этим запросом MySQL? - PullRequest
4 голосов
/ 19 марта 2011

Это работает:

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 ]

7 голосов
/ 19 марта 2011

Цитата Ошибка # 45987, ОШИБКА 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.

1 голос
/ 19 марта 2011

Разве ошибка не объясняет это лаконично? Столбец AUTO_INCREMENT & mdash; если у вас есть один & mdash; должен быть ключевым столбцом.

Как вы продемонстрировали, решение этой проблемы решает проблему.

1 голос
/ 19 марта 2011

вы ДОЛЖНЫ определить столбец 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 голос
/ 19 марта 2011

@ 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 голос
/ 19 марта 2011

+ 1 для использования без знака и т.д .. но вы говорите ... это может быть не нуль ... НО по умолчанию его 0 .. и для меня 0 всегда ноль? и первичный ключ, который auto_increment, никогда не будет нулевым. Ты хорош в хорошем направлении, но сделай это так:

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 голос
/ 19 марта 2011

Ну, я не эксперт по MySQL, но

shout_id INT НЕ ПОДПИСАНО, НЕДЕЙСТВИТЕЛЬНО AUTO_INCREMENT

- автоинкремент, не определяемый как ключ ....

Учитывая множество неясных или вводящих в заблуждение сообщений об ошибках, с которыми мы сталкиваемся в этом бизнесе, я не могу представить более четкое сообщение об ошибке ....

...