【发布时间】:2010-10-19 13:35:24
【问题描述】:
我正在使用 JDBC 编写同时使用 SQLite 和 MySQL 的 java 应用程序。
这些数据库的 SQL 有什么不同吗?我可以对 SQLite 和 MySQL 使用相同的查询吗,或者是否有任何特定于 db 的东西在另一个上不起作用?
到目前为止,我只使用过 MySQL,所以我对 SQLite 了解不多。
【问题讨论】:
我正在使用 JDBC 编写同时使用 SQLite 和 MySQL 的 java 应用程序。
这些数据库的 SQL 有什么不同吗?我可以对 SQLite 和 MySQL 使用相同的查询吗,或者是否有任何特定于 db 的东西在另一个上不起作用?
到目前为止,我只使用过 MySQL,所以我对 SQLite 了解不多。
【问题讨论】:
如果你坚持ANSI SQL92,你应该没问题。
MySQL 和 SQLite 都缺少一些 SQL92 功能(例如 FULL OUTER JOIN)。 MySQL 有 RIGHT JOIN 和 LEFT JOIN,SQLite 只有 LEFT JOIN。 SQLite 不支持 FOREIGN KEY 约束,MySQL 也不支持 MyISAM 表。 SQLite 当然没有 GRANT/REVOKE,因为权限系统是基于底层操作系统的文件权限的。
【讨论】:
我正在做类似的事情。除了我遇到的提到的那些之外,还有一些不同之处:
在带有 Xerial JDBC 驱动程序的较新版本的 SQLite3 中,确实支持外键。 SQLite 支持内联外键约束定义:
CREATE TABLE Blah (foreignId Integer REFERENCES OtherTable (id));
MySQL(使用 InnoDB)接受相同的语法,但实际上不会强制执行约束,除非您使用单独的 FOREIGN KEY 子句显式命名外部表和键列:
CREATE TABLE Blah(foreignId INTEGER, FOREIGN KEY foreignId REFERENCES OtherTable (id));
旧版本的 SQLite JDBC 驱动程序不支持 Statement.RETURN_GENERATED_KEYS;已在较新的 Xerial 驱动程序中修复。
自动递增键的语法不同; SQLite: (id INTEGER PRIMARY KEY ASC, ...); MySQL: (id INTEGER PRIMARY KEY AUTO_INCREMENT, ...)
SQLite 接受 n 路逗号分隔连接:
从 A、B、C 中选择 *(A.x = B.y 和 B.y = C.z);
MySQL 没有;以下两者都适用:
SELECT * FROM A INNER JOIN B ON A.x = B.y INNER JOIN C ON B.y = C.z;
关于类型差异,SQLite 的 JDBC 驱动程序的一个相关烦恼是同一列可以通过 ResultSet.getObject(.); 产生不同的类型;例如,Integer 或 Long 取决于所包含数字的大小。
SQLite 中的自动递增键必须声明为 INTEGER 类型;在 MySQL 中,任何数字整数类型都有效。
【讨论】:
一个很大的区别是type system。 SQLite 允许您将任何类型的数据放在任何列中。但是,如果可能,它会将数据转换为列的声明类型。
【讨论】: