根据我的经验,即使有一个SQL标准,在很多RDBMS上编写可以不修改的SQL也很困难.
因此,我想知道是否存在可用于所有主要RDBMS的SQL子集(包括DDL,模式等),包括PostgreSQL,MySQL,SQL Server以及最后但并非最不重要的Oracle.编写可移植SQL时应该避免哪些陷阱?
那么,是否有一个项目的目标是将有效的SQL子集转换为所有这些供应商使用的特定方言?我知道Hibernate和其他ORM系统必须这样做,但我不想要ORM,我想编写直接数据库SQL.
谢谢!
问题是一些 DBMS 甚至忽略了最简单的标准(例如引用字符或字符串连接)。
因此以下(100% ANSI SQL)不会在每个 DBMS 上运行:
UPDATE some_table
SET some_column = some_column || '_more_data';
Run Code Online (Sandbox Code Playgroud)
而且我什至没有考虑更高级的 SQL 标准,如递归公用表表达式(即使支持它的那些并不总是遵守)或窗口函数(有些只实现一个非常狭窄的子集,有些不支持所有选项)。
关于DDL,存在数据类型的问题。DATE
到处都不一样,就像TIMESTAMP
. 并非每个 DBMS 都有BOOLEAN
类型或TIME
类型。
当涉及到约束或域时,您会得到更多差异。
所以简而言之:除非你真的、真的需要独立于 DBMS,否则不要打扰它。
说了这么多:如果您确实可以在专有语法和标准语法之间进行选择,请选择标准语法(OUTER JOIN
vs (+)
or *=
、decode
vs CASE
、nvl
vs.coalesce
等等)。