2010-01-20 150 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

相关问题