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

时间:2016-12-07 19:50:06

标签: mysql sql sqlite

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

  

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

导入时出现错误

  
      
  • SQLITE_ERROR:near" AUTO_INCREMENT":语法错误
  •   

documented here

  

在SQLite中,声明为INTEGER PRIMARY KEY的列将自动自动增量。删除AUTOINCREMENT关键字,然后尝试。

我无法移除AUTOINCREMENT,因为它是mysql所必需的。有什么建议吗?

1 个答案:

答案 0 :(得分:4)

我有一个解决方案。

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