微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用AUTO_INCREMENT创建与SQLite和mysql兼容的SQL

我有一个mysql .sql文件,我试图使用sqlite内存数据库进行测试,使用相同的文件.

CREATE TABLE IF NOT EXISTS users (
user_id INTEGER PRIMARY KEY AUTO_INCREMENT,

导入时我收到错误

  • sqlITE_ERROR: near “AUTO_INCREMENT”: Syntax error

这是documented here

In sqlite a column declared INTEGER PRIMARY KEY will autoincrement by itself. Remove the AUTOINCREMENT keyword and then try.

我无法删除AUTOINCREMENT,因为它是MysqL所必需的.有什么建议?

解决方法:

我有一个解决方案给你.

MysqL支持一种特殊的注释语法,用于何时使用在较新版本的MysqL中工作但在早期版本中不能使用的语法.也许你在MysqLdump输出中看到过这种东西:

CREATE TABLE `products` (
  `product_id` int NOT NULL,
  PRIMARY KEY (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

注意注释中的字符集语句,带有一个有趣的字符串!40101表示“如果MysqL的版本低于4.1.1,则忽略该字符串作为注释,否则将其作为sql语句的一部分执行.”

而在sqlite中,注释的内部始终只是一个注释.

所以你可以像这样定义你的表:

CREATE TABLE IF NOT EXISTS users ( 
  user_id INTEGER PRIMARY KEY /*!40101 AUTO_INCREMENT */,
   . . .

sqlite将忽略AUTO_INCREMENT,但MysqL将使用它,假设您使用的是4.1.1或更高版本(这是完全确定的).

我刚刚使用sqlite 3.8.5和MysqL 8.0.0-dmr对此进行了测试,并且create table在两种情况下都有效.

INTEGER没问题,因为它是MysqL中INT的同义词.不要在sqlite中使用INT,因为主键列不会自动递增,除非你真的使用类型INTEGER.

永远不要担心MysqL中的INT参数,比如INT(11),这个数字并不意味着什么重要.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐