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
MYSQL40
或 MYSQL323
。
长篇大论
正如其他人所说,CREATE TABLE
的 TYPE
参数在 MySQL 中已被弃用很长时间。 mysqldump
正确使用 ENGINE
参数,除非您明确要求它生成向后兼容的转储(例如,在 mysqldump
最高 5.7 的版本中使用 --compatible=mysql40
)。
但是,许多外部 SQL 转储工具(例如,那些集成在 MySQL 客户端中的工具,如 phpmyadmin、Navicat 和 DBVisualizer,以及由外部自动备份服务(如 iControlWP)使用的工具)并没有特别意识到这一变化,并且而是依靠SHOW CREATE TABLE ...
命令为每个表提供表创建语句(并且明确表示:这实际上是一件好事)。但是,如果sqlmode
变量设置为MYSQL40
或MYSQL323
,SHOW CREATE TABLE
实际上会产生过时的语法,包括TYPE
参数。
因此,如果您仍然在由第三方工具生成的 SQL 转储文件中看到 CREATE TABLE ... TYPE="..."
语句,这肯定表明您的服务器配置为使用默认的 sqlmode
MYSQL40
或 MYSQL323
。
这些sqlmode
s 基本上配置 MySQL 以保留一些向后兼容的行为,并且在几年前主要推荐默认使用它们。然而,如果没有这些模式,您仍然有任何无法正常工作的代码是极不可能的。无论如何,MYSQL40
、MYSQL323
和其他几个类似的sqlmode
s 本身已被弃用,并且在 MySQL 8.0 及更高版本中不受支持。
如果您的服务器仍然配置了这些sqlmode
s,并且您担心如果更改这些旧程序可能会失败,那么一种可能性是通过执行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的主要内容,如果未能解决你的问题,请参考以下文章
CREATE FUNCTION 引发 SQL 错误 (1064) (42000)
SQL ALTER TABLE ADD PRIMARY KEY 错误 1064