MySQL和SQLite在SQL中的差异

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

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

到目前为止,我只使用MySQL ,所以我对SQLite并不是很了解。

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

MySQL和SQLite都缺少一些SQL92function(例如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路逗号分隔的连接:
    SELECT * FROM A,B,C ON(Ax = By AND By = Cz);

    MySQL没有; 以下两者均有效:
    SELECT * FROM INNER JOIN B ON Ax = INNER JOIN C ON By = Cz;

  • 关于类型差异,与SQLite的JDBC驱动程序相关的烦恼是同一列可以通过ResultSet.getObject(。)生成不同的类型; 例如,Integer或Long取决于所包含数字的大小。

  • SQLite中的自动递增键必须声明为INTEGER类型; 在MySQL中任何数字整数类型都有效。

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