当前位置:首页 > 数据库 > SQlite

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


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!