【问题标题】:MySQL and SQLite differences in SQLSQL 中 MySQL 和 SQLite 的区别
【发布时间】:2010-10-19 13:35:24
【问题描述】:

我正在使用 JDBC 编写同时使用 SQLiteMySQL 的 java 应用程序。

这些数据库的 SQL 有什么不同吗?我可以对 SQLiteMySQL 使用相同的查询吗,或者是否有任何特定于 db 的东西在另一个上不起作用?

到目前为止,我只使用过 MySQL,所以我对 SQLite 了解不多。

【问题讨论】:

    标签: java mysql sqlite jdbc


    【解决方案1】:

    如果你坚持ANSI SQL92,你应该没问题。

    MySQL 和 SQLite 都缺少一些 SQL92 功能(例如 FULL OUTER JOIN)。 MySQL 有 RIGHT JOIN 和 LEFT JOIN,SQLite 只有 LEFT JOIN。 SQLite 不支持 FOREIGN KEY 约束,MySQL 也不支持 MyISAM 表。 SQLite 当然没有 GRANT/REVOKE,因为权限系统是基于底层操作系统的文件权限的。

    【讨论】:

    【解决方案2】:

    我正在做类似的事情。除了我遇到的提到的那些之外,还有一些不同之处:

    • 在带有 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 中,任何数字整数类型都有效。

    【讨论】:

    • 您能否验证您使用的sqlite jdbc 驱动程序版本似乎支持 RETURN_GENERATED_KEYS ?我尝试了许多不同的版本,但都没有成功
    • xerial.org/trac/Xerial/wiki/SQLiteJDBC 至少从 3.6.20.1 开始工作
    【解决方案3】:

    一个很大的区别是type system。 SQLite 允许您将任何类型的数据放在任何列中。但是,如果可能,它会将数据转换为列的声明类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-18
      • 2018-06-23
      • 2017-10-24
      • 2013-01-28
      相关资源
      最近更新 更多