根据我的经验,即使有一个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';
而且我甚至没有考虑更高级的sql标准,比如递归的普通表表达式(即使那些支持它的表达式并不总是符合)或者窗口函数(一些仅实现非常窄的子集,有些不支持所有选项).
关于DDL,数据类型有问题. DATE不尽相同,就像TIMESTAMP一样.不是每个DBMS都有一个BOOLEAN类型或TIME类型.
当涉及到约束或域名时,您会得到更多的差异.
所以简而言之:除非你真的,真的需要独立于DBMS,不用担心.
说完所有这些:如果你有专有和标准语法之间的选择,可以选择标准语法(OUTER JOIN vs()或* =,解码vs CASE,nvl对合并等等).