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的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 MySQL CREATE TABLE 语句失败?

CREATE FUNCTION 引发 SQL 错误 (1064) (42000)

SQL ALTER TABLE ADD PRIMARY KEY 错误 1064

CREATE TABLE 语句中的语法错误

SQL Server 中“CREATE TABLE table AS”中的“分发选项”错误

CREATE TABLE 错误也会导致隐式提交中的错误?