2010-01-20 38 views
0

如下所示,對於不同的數據庫,其語法不同.Isnt存在一種適用於所有數據庫的標準方法。 是否有任何SQL轉換爲任何SQL的任何工具是否存在適用於所有數據庫的標準sql

SQLServer2005的:

CREATE TABLE Table01 ( 
Field01 int primary key identity(1,1) 
) 

SQLite的:

CREATE TABLE Table01 (
    Field01 integer PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE 
); 

回答

7

SQL的「查詢」部分(通常稱爲DML-數據操作語言)是合理標準化的,如果沒有使用「供應商增強」功能,寫入一個數據庫的查詢通常會運行在另一個數據庫上。 SQL的「創建數據庫位」部分(通常稱爲DDL - 數據定義語言)沒有標準化,而且每個數據庫都有一點不同。因此,正如您發現的那樣,爲某個數據庫編寫的語句(如CREATE TABLE)不會在未對另一個數據庫進行調整的情況下運行。

<soapbox>
在我看來,這是一件好事。 DDL有效地定義了可以在數據庫中創建的內容。如果所有供應商使用剛好相同的DDL,那麼所有產品將在正好就其所支持的功能而言。例如,爲了允許PostgreSQL中的表繼承,必須有一些方法來定義一個表是如何從另一個表繼承的,並且這個定義必須是如何定義表的一部分,既可以作爲CREATE TABLE語句的一部分,也可以作爲其他時尚,但它必須是一個DDL聲明。因此,出於純粹的功能性原因(因爲PostgreSQL支持大多數數據庫不支持的功能),PostgreSQL 中的DDL必須與其他數據庫中的不同。在MySQL中也會出現類似的情況,因爲它允許使用具有不同功能的不同ISAM引擎。類似的情況出現在Oracle ...和SQL Server中......以及<your favorite database here>

標準是一把雙刃劍。一方面他們是一件好事,因爲他們提供了一種「標準」的做事方式。另一方面,這是一件可怕的事情,因爲標準的目的是提供一種「標準」的做事方式,這是另一種說法:「製造停滯和抑制創新」。
</soapbox>

分享和享受。

+0

我認爲,即使個人數據庫有一些變化,所有數據庫應至少與基本功能,如外鍵,主鍵,唯一,非空約束兼容的標準。 – Thunder 2010-01-21 04:55:27

0

沒有,有這個沒有標準的SQL。作爲一個無恥的插件,如果你涉及到數據庫模式遷移/持續集成的任何事情,我可以推薦嘗試Wizardby

2

several SQL standards那裏,SQL 1999可能是最接近你會得到,因爲每個DB採用了不同的標準(如果有的話)。

+0

SQL 1999有一些不是普遍實現的部分,其中我能想到的最重要的部分是窗口函數。也許我們必須堅持SQL 92? – lins314159 2010-01-20 13:10:24

相關問題