使用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),这个数字并不意味着什么重要.

相关文章

SQLite架构简单,又有Json计算能力,有时会承担Json文件/RES...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器...
安卓开发,利用SQLite实现登陆注册功能