2009-04-15 72 views
4

我正在編寫同時使用SQLite的MySQL應用程序MySQL使用JDBC。SQL中的MySQL和SQLite差異

對於這些數據庫,SQL有什麼區別嗎?我是否可以對SQLiteMySQL使用相同的查詢,或者是否有任何數據庫特定的內容,這對另一個不起作用?

據我已經與MySQL的工作,所以我真的不知道很多關於SQLite的

回答

5

如果你堅持ANSI SQL92,你應該沒問題。

MySQL和SQLite都缺少一些SQL92功能(例如FULL OUTER JOIN)。 MySQL有兩個RIGHT JOIN和LEFT JOIN,SQLite只有LEFT JOIN。 SQLite不支持FOREIGN KEY約束,MySQL和MyISAM表都不支持。 SQLite當然沒有GRANT/REVOKE,因爲權限系統是基於底層操作系統的文件權限。

+4

從版本3.6.19開始,SQLite支持FOREIGN KEY約束,請參閱http://www.sqlite.org/foreignkeys.html。 – 2010-05-12 14:36:43

1

最大的區別是type system。 SQLite允許你在任何列中放置任何類型的數據。但是,如果可能的話,它會將數據轉換爲列的聲明類型。

5

我正在做類似的事情。還有,除了提到的那些,我遇到了一些區別:在sqlite3的與Xerial JDBC驅動程序的新版本

  • ,外鍵確實支持。 SQLite支持內聯外鍵約束定義:
    CREATE TABLE Blah(foreignId Integer REFERENCES OtherTable(id));

    的MySQL(和InnoDB的)將接受相同的語法,但實際上不會強制約束,除非你使用一個單獨的FOREIGN KEY條款,明確指定外部表和鍵列(S):
    CREATE TABLE布拉赫(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(A.x = B.y AND 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(。)生成不同的類型;例如,整數或長整數,取決於包含的數字的大小。

  • SQLite中的自動遞增鍵必須聲明爲INTEGER;在MySQL中任何數字整數類型的作品。

+0

你可以驗證你正在使用哪個版本的sqlite jdbc驅動程序,它似乎支持RETURN_GENERATED_KEYS?我嘗試了許多不同的版本,但沒有運氣 – Amit 2010-11-28 18:26:29