Ошибка 1064 в CREATE TABLE... TYPE = MYISAM
Вот моя ошибка (если вам нужна дополнительная информация, просто спросите) -
ошибка
SQL-запрос:
CREATE TABLE dave_bannedwords(
id INT( 11 ) NOT NULL AUTO_INCREMENT ,
word VARCHAR( 60 ) NOT NULL DEFAULT '',
PRIMARY KEY ( id ) ,
KEY id( id )
) TYPE = MYISAM ;
MySQL сказал:
1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии сервера MySQL, для правильного использования синтаксиса около 'TYPE = MyISAM' в строке 6
Ответы
Ответ 1
Как описано в CREATE TABLE
Синтаксис:
Примечание
Более старая опция TYPE
была синонимом ENGINE
. TYPE
устарел в MySQL 4.0 и удален в MySQL 5.5. При обновлении до версии MySQL 5.5 или новее вы должны преобразовать существующие приложения, которые полагаются на TYPE
вместо ENGINE
.
Следовательно, вы хотите:
CREATE TABLE dave_bannedwords(
id INT(11) NOT NULL AUTO_INCREMENT,
word VARCHAR(60) NOT NULL DEFAULT '',
PRIMARY KEY (id),
KEY id(id) -- this is superfluous in the presence of your PK, ergo unnecessary
) ENGINE = MyISAM ;
Ответ 2
Дополнительное примечание о синтаксисе CREATE TABLE.. TYPE=""
в файлах дампа SQL
TL;DR: Если вы по-прежнему получаете операторы CREATE TABLE... TYPE="..."
в файлах дампа SQL, созданных сторонними инструментами, это, безусловно, означает, что ваш сервер настроен на использование sqlmode
по умолчанию MYSQL40
или MYSQL323
.
Длинная история
Как говорили другие, аргумент TYPE
для CREATE TABLE
давно устарел в MySQL. mysqldump
правильно использует аргумент ENGINE
, если вы специально не попросите его сгенерировать обратно совместимый дамп (например, используя --compatible=mysql40
в версиях mysqldump
до 5.7).
Однако многие внешние инструменты дампа SQL (например, те, которые интегрированы в клиенты MySQL, такие как phpmyadmin, Navicat и DBVisualizer, а также те, которые используются внешними автоматизированными службами резервного копирования, такими как iControlWP), специально не знают об этом изменении и вместо этого полагаются на команда SHOW CREATE TABLE...
чтобы обеспечить операторы создания таблиц для каждой таблицы (и просто дать понять: это на самом деле хорошая вещь). Однако SHOW CREATE TABLE
фактически создаст устаревший синтаксис, включая аргумент TYPE
, если переменная sqlmode
установлена в MYSQL40
или MYSQL323
.
Следовательно, если вы по-прежнему получаете операторы CREATE TABLE... TYPE="..."
в файлах дампа SQL, созданных сторонними инструментами, это, безусловно, указывает на то, что ваш сервер настроен на использование sqlmode
по умолчанию MYSQL40
или MYSQL323
.
Эти sqlmode
основном настраивают MySQL для сохранения некоторых обратно совместимых sqlmode
поведения, и их использование по умолчанию было рекомендовано несколько лет назад. Однако очень маловероятно, что у вас все еще есть код, который не будет работать правильно без этих режимов. В любом случае, MYSQL40
, MYSQL323
и некоторые другие подобные sqlmode
сами по себе устарели и не поддерживаются в MySQL 8.0 и выше.
Если ваш сервер все еще сконфигурирован с этими sqlmode
и вы беспокоитесь, что какая-то устаревшая программа может дать сбой, если вы их измените, то одна возможность - установить sqlmode
локально для этой программы, выполнив SET SESSION sql_mode = 'MYSQL40';
сразу после подключения. Обратите внимание, что это следует рассматривать только как временное исправление и не будет работать в MySQL 8.0 и выше.
Более перспективным решением, которое не включает переписывание ваших SQL-запросов, было бы точное определение того, какие функции совместимости должны быть включены, и включение только тех, для каждой программы (как описано ранее). sqlmode
умолчанию (то есть в конфигурации сервера) в идеале следует оставить равным его значению по умолчанию. Полный список sqlmode
(sqlmode
с MySQL 5.7) описан здесь: https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html.
Ответ 3
CREATE TABLE `admnih` (
`id` int(255) NOT NULL auto_increment,
`asim` varchar(255) NOT NULL default '',
`brid` varchar(255) NOT NULL default '',
`rwtbah` int(1) NOT NULL default '0',
`esmmwkeh` varchar(255) NOT NULL default '',
`mrwr` varchar(255) NOT NULL default '',
`tid` int(255) NOT NULL default '0',
`alksmfialdlil` int(255) NOT NULL default '0',
`tariktsjil` varchar(255) NOT NULL default '',
`aimwke` varchar(255) NOT NULL default '',
`twkie` text NOT NULL,
`rwtbahkasah` int(255) NOT NULL default '0',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=2 ;
Ответ 4
SELECT Email, COUNT(*)
FROM user_log
WHILE Email IS NOT NULL
GROUP BY Email
HAVING COUNT(*) > 1
ORDER BY UpdateDate DESC
MySQL сказал: Документация # 1064 - У вас есть ошибка в вашем SQL синтаксис; проверьте руководство, соответствующее версии вашего сервера MySQL. для правильного синтаксиса для использования рядом с "TYPE = MyISAM" по строке 36
Какая коррекция ниже:
CREATE TABLE users_online (
ip varchar(15) NOT NULL default '',
time int(11) default NULL,
PRIMARY KEY (ip),
UNIQUE KEY id (ip),
KEY id_2 (ip)
TYPE=MyISAM;
)
#
# Data untuk tabel `users_online`
#
INSERT INTO users_online VALUES ('127.0.0.1', 1158666872);
Ответ 5
Попробуйте следующий запрос
CREATE TABLE card_types (
card_type_id int(11) NOT NULL auto_increment,
name varchar(50) NOT NULL default '',
PRIMARY KEY (card_type_id),
) ENGINE = MyISAM ;