CREATE TABLE 中的 1064 错误 ... TYPE=MYISAM

Posted

技术标签:

【中文标题】CREATE TABLE 中的 1064 错误 ... TYPE=MYISAM【英文标题】:1064 error in CREATE TABLE ... TYPE=MYISAM 【发布时间】:2012-09-07 20:50:58 【问题描述】:

这是我的错误(如果您需要更多信息,请询问)- 错误 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 服务器版本相对应的手册以获取正确的语法使用 在第 6 行的“TYPE=MyISAM”附近

【问题讨论】:

密钥(id)也是多余的。由于主键,它已经被索引了 【参考方案1】:

CREATE TABLE Syntax 中所述:

注意 较旧的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 ;

【讨论】:

是的,就是这样。 Type 曾经是 ENGINE 的同义词,但在 4.0 中已弃用并在 5.5 中删除。 感谢大家的帮助 :) 但我认为整个 mysql 数据库就是这样 :( @eggyal #1060 - 列名“id”重复 @NicholasMcLovinzRothapfel:打扰一下?【参考方案2】:
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 ;

【讨论】:

这是问题的答案吗?问题中的表名是dave_bannedwords,而不是admnih【参考方案3】:
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 服务器版本相对应的手册 在第 36 行的 'TYPE=MyISAM' 附近使用正确的语法


以下哪个更正:

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);

【讨论】:

这是问题的答案吗?问题中的表名是dave_bannedwords,而不是users_online【参考方案4】:

试试下面的查询

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 ;

【讨论】:

这是问题的答案吗?问题中的表名是dave_bannedwords,而不是card_types【参考方案5】:

关于 SQL 转储文件中 CREATE TABLE .. TYPE="" 语法的补充说明

TLDR:如果您仍然在第三方工具生成的 SQL 转储文件中看到 CREATE TABLE ... TYPE="..." 语句,这肯定表明您的服务器配置为使用默认的 sqlmode MYSQL40MYSQL323

长篇大论

正如其他人所说,CREATE TABLETYPE 参数在 MySQL 中已被弃用很长时间。 mysqldump 正确使用 ENGINE 参数,除非您明确要求它生成向后兼容的转储(例如,在 mysqldump 最高 5.7 的版本中使用 --compatible=mysql40)。

但是,许多外部 SQL 转储工具(例如,那些集成在 MySQL 客户端中的工具,如 phpmyadmin、Navicat 和 DBVisualizer,以及由外部自动备份服务(如 iControlWP)使用的工具)并没有特别意识到这一变化,并且而是依靠SHOW CREATE TABLE ... 命令为每个表提供表创建语句(并且明确表示:这实际上是一件好事)。但是,如果sqlmode 变量设置为MYSQL40MYSQL323SHOW CREATE TABLE 实际上会产生过时的语法,包括TYPE 参数。

因此,如果您仍然在由第三方工具生成的 SQL 转储文件中看到 CREATE TABLE ... TYPE="..." 语句,这肯定表明您的服务器配置为使用默认的 sqlmode MYSQL40MYSQL323

这些sqlmodes 基本上配置 MySQL 以保留一些向后兼容的行为,并且在几年前主要推荐默认使用它们。然而,如果没有这些模式,您仍然有任何无法正常工作的代码是极不可能的。无论如何,MYSQL40MYSQL323 和其他几个类似的sqlmodes 本身已被弃用,并且在 MySQL 8.0 及更高版本中不受支持。

如果您的服务器仍然配置了这些sqlmodes,并且您担心如果更改这些旧程序可能会失败,那么一种可能性是通过执行SET SESSION sql_mode = 'MYSQL40'; 为该程序在本地设置sqlmode连接后立即。请注意,这仅应被视为临时补丁,在 MySQL 8.0 及更高版本中不起作用。

不涉及重写 SQL 查询的更面向未来的解决方案是确定需要启用哪些兼容性功能,并仅在每个程序的基础上启用这些功能(如前所述)。默认的sqlmode(即在服务器的配置中)最好不要设置(这将为您当前的版本使用官方的 MySQL 默认值)。 sqlmode(从 MySQL 5.7 开始)的完整列表如下所述:https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html

【讨论】:

以上是关于CREATE TABLE 中的 1064 错误 ... TYPE=MYISAM的主要内容,如果未能解决你的问题,请参考以下文章