MySQL的SQL文件转换为适用于SQLite的SQL文件

最近了解到一个较小众的数据库SQLite,打算拿来玩一玩,但手上目前只有MySQL的一些库表文件无法直接导入使用,所以出一期记录,手动进行二者转换

分析SQL语句

首先要明确,MySQL和SQLite两者格式差别不止限于字段类型、特殊的函数等,特别是 CREATE TABLEINSERT INTOALTER TABLE等语句,这些都需要特别关注。

转换数据类型

将MySQL的数据类型转换为SQLite对应的数据类型。例如,将 INTINTEGER 转换为 INTEGER ,将 VARCHARTEXTCHAR 转换为 TEXT ,将 DATETIMETIMESTAMP 转换为 TEXTDATETIME(SQLite没有专门的日期时间类型,但可以使用TEXT、REAL或INTEGER来存储日期和时间)。

数据类型 MySQL SQLite
整数型 TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT INTEGER
浮点型 FLOAT, DOUBLE, DECIMAL(M,D) REAL
字符串类型 CHAR(M), VARCHAR(M), TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT TEXT
日期和时间类型 DATE, TIME, DATETIME, TIMESTAMP, YEAR 无内置类型,一般存为TEXT
sql 复制代码
# mysql
CREATE TABLE users (  
  	id INT PRIMARY KEY,  
   	name VARCHAR(50) NOT NULL,   
   	created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
 );
 # sqlite
CREATE TABLE users (  
     id INTEGER PRIMARY KEY,  
     name TEXT NOT NULL,  
     created_at TEXT DEFAULT (datetime('now'))  
 );

处理自增字段

在MySQL中,自增字段通常使用 AUTO_INCREMENT 属性。在SQLite中,自增字段使用 INTEGER PRIMARY KEY AUTOINCREMENT。确保转换这些字段的定义。

sql 复制代码
# mysql
CREATE TABLE users (  
    id INT AUTO_INCREMENT PRIMARY KEY 
);
# sqlite
CREATE TABLE users (  
    id INTEGER PRIMARY KEY AUTOINCREMENT
);

处理默认值和约束

确保MySQL中使用的默认值和约束在SQLite中也是有效的。有些默认值或约束在SQLite中可能不被支持,需要进行相应的调整。

  • 外键约束:

    • MySQL:使用 FOREIGN KEY 关键字定义外键约束。

    • SQLite :在早期版本中不支持外键约束,但在3.6.19版本之后开始支持。虽然支持,但默认情况下外键约束是关闭的,需要显式开启(使用 PRAGMA foreign_keys = ON;)。

  • 默认值和NOT NULL约束:

    • MySQL:可以为列设置默认值,并使用 NOT NULL 约束确保列不能存储NULL值。

    • SQLite :支持 NOT NULL 约束,以及为列设置默认值。但在SQLite中,如果某列没有显式设置默认值且没有 NOT NULL 约束,那么它默认可以接受NULL值。

  • 唯一约束:

    在 MySQL 和 SQLite 中二者没有区别,都可以使用 UNIQUE 约束来确保某列中的所有值都是唯一的。

  • 检查约束:

    • MySQL:在8.0及之后的版本支持 CHECK 约束,用于限制列中的值必须满足的条件。

    • SQLite :支持 CHECK 约束,用于确保列中的值满足特定的条件或表达式。

  • 存储引擎与性能:

    • MySQL:支持多种存储引擎,如 InnoDB 和 MyISAM,每种引擎都有其特定的性能特点和功能。

    • SQLite :使用单一的磁盘文件来存储整个数据库,没有存储引擎的概念,因此其性能特点与MySQL的存储引擎有所不同。

转换函数和特性

如果SQL文件中使用了MySQL特有的函数或特性,需要查找SQLite中的等效函数或特性,并进行替换。

例如,MySQL的 NOW() 函数在SQLite中可以使用 datetime('now')CURRENT_TIMESTAMP 来替代。

移除不支持的语句

删除或注释掉SQL文件中SQLite不支持的语句,如MySQL特有的存储过程、触发器、引擎等。


ps:写在最后,手动转换实在太累,可以借助 Navicat 工具进行二者转换,将MySQL导出向导为 .txt 格式,最后在SQLite里导入向导即可。

相关推荐
这个DBA有点耶15 小时前
SQL改写进阶:标量子查询的“隐形代价”与消除实战
数据库·mysql·架构
smallyoung17 小时前
数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南
数据库·mysql·postgresql
数据技术说21 小时前
MySQL 迁移实战——如何实现真正的"零改造"平滑切换
mysql
唐青枫5 天前
MySQL JSON 实战详解:从存储、查询、更新到 JSON_TABLE 与索引
sql·mysql
小满8785 天前
5.Mysql事务隔离级别与锁机制
mysql
元Y亨H6 天前
技术笔记:MySQL 字符集排序规则与大小写敏感性问题解决方案
mysql
这个DBA有点耶7 天前
GROUP BY优化全解:如何写出既不丢数据又飞快的分组查询
数据库·mysql·架构
掉头发的王富贵7 天前
【StarRocks】极限十分钟入门StarRocks
数据库·sql·mysql
SamDeepThinking7 天前
一条UPDATE语句在MySQL 8.0中到底加了几把锁?
后端·mysql·程序员
李白客9 天前
KES新版MySQL兼容能力再升级意味着什么?
mysql·国产数据库