可移植SQL:唯一主键
试图开发出在大型RDBMS之间可以移植的东西 问题是如何生成并使用自动递增数字作为表的主键 这里有两个主题可移植SQL:唯一主键,sql,sql-server,oracle,postgresql,Sql,Sql Server,Oracle,Postgresql,试图开发出在大型RDBMS之间可以移植的东西 问题是如何生成并使用自动递增数字作为表的主键 这里有两个主题 用于生成自动递增数字的机制 如何指定要将其用作 桌子 我正在寻找我认为的当前事态的验证: 不幸的是,该领域的标准化起步较晚,在某些方面仍未实施(作为强制性标准)。这意味着在2013年仍然无法以可移植的方式编写CREATETABLE语句。。。如果您希望它具有自动生成的主键 真的会这样吗 Re(1)。这是标准化的,因为它出现在SQL:2003中。据我所知,要走的路是序列。我相信这是SQL:20
SQL99 standard: for SELECT DISTINCT, ORDER BY expressions must appear in select list
这条消息来自PostgreSql,Oracle 11g没有抱怨。14年后,他们会改变吗
一般来说,您仍然需要编写特定于数据库的代码
至于您的结论:在我们的场景中,我们使用模型驱动的方法实现了一个可移植的数据库应用程序。这个逻辑元数据由应用程序使用,不同的数据库类型有不同的后端。我们不使用任何ORM,只使用“直接SQL”,因为这简化了SQL语句的调优,并提供了对所有SQL特性的完全访问。我们编写了自己的图书馆,后来我们发现关键思想与“Anorm”的这些思想相匹配
好消息是,虽然有很多小麻烦,但它工作得相当好,即使是复杂的查询。例如,窗口聚合函数是非常可移植的(row_number(),partition by)。您必须在Oracle上使用listagg,而在PostgreSql上则需要string_agg。在PostgreSql中,递归Commo表表达式需要“with Recursive”,Oracle不喜欢它。PostgreSql支持查询中的“限制”和“偏移”,您需要在Oracle中包装这一点。如果在Oracle和PostgreSql中都使用SQL数组(数组作为表中的列),这会让你发疯。Oracle上有物化视图,但在PostgreSql中不存在。令人惊讶的是,不仅可以用Java编写数据库存储过程,还可以用Scala编写数据库存储过程,这在Oracle和PostgreSql中都非常有效。这个列表不完整。但到目前为止,我们设法为任何“可移植性问题”找到了一个可接受的(=快速)解决方案
有回报吗?在我们的场景中,有一个中央Oracle安装(RAC,读/写),但每个应用服务器上都有作为本地主机数据库的分布式PostgreSql安装(只读)。这将大大提高性能和可扩展性,而不会降低成本
如果您真的只想在数据库中解决这个问题,那么有一种可能性:将任何内容放在存储过程中,用Java/Scala编写这些过程,并限制自己在应用程序中调用这些过程和读取结果集。这当然只是将复杂性从应用程序层转移到数据库中,但您接受了黑客攻击:-)
如果使用Java存储过程,触发器是相当标准化的。如果您的数据库、管理层和da支持它