当前位置:  开发笔记 > 编程语言 > 正文

MySQL和SQLite在SQL中的差异

如何解决《MySQL和SQLite在SQL中的差异》经验,为你挑选了2个好方法。

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

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

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



1> vartec..:

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

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


从版本3.6.19开始,SQLite支持FOREIGN KEY约束,请参阅http://www.sqlite.org/foreignkeys.html.

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参考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 A INNER JOIN B ON Ax = INNER JOIN C ON By = Cz;

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

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

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有