sql - 如何在可移植 SQL 中包含特定于 PostgreSQL 的代码?

标签 sql postgresql syntax portability

在 MySQL 中,可以通过使用如下特定的注释语法在通用/标准 SQL 中包含 MySQL 特定的 SQL 语句:

INSERT /*! DELAYED */ INTO foo VALUES (1, 2, 3);

这在 http://dev.mysql.com/doc/refman/5.1/en/comments.html 中有描述.

是否有任何等效的语法或 hack 可以与 PostgreSQL 一起使用以将 PostgreSQL 特定的语句嵌入同一文件中?

我想让我的应用程序在两个平台上都可移植,但在某些情况下,我找不到通用的做事方式,需要做特定于数据库的事情。例如,在这些数据库引擎上,在表中放置一个自动递增的列是完全不同的,但数据库模式的大多数其他部分完全相同并且可以共享。因此,我宁愿在分发中只包含一个 create-the-database.sql 文件,因为它更容易维护并且感觉更整洁。

最佳答案

接受并创建一个“postgresql.sql”文件和一个“mysql.sql”文件。这需要很少的努力。您可以老派使用 cpp(1),这样两个模式都在同一个文件中,甚至交错。

% cat foo.sql
#ifdef USE_POSTGRESQL
CREATE TABLE pg_epicness (
  -- PostgreSQL schema def
);
#elif USE_MYSQL
CREATE TABLE phail (
  -- idontcareaboutmyusers schema def
);
#endif
% cat foo.sql | cpp -DUSE_POSTGRESQL | grep -v ^# > postgresql.sql
% cat foo.sql | cpp -DUSE_MYSQL | grep -v ^# > mysql.sql

不漂亮,但正如您所说,您正在寻找黑客。由于无论如何在您的 .sql 文件中都不应该有任何前导磅字符,因此它是“安全的”。

关于sql - 如何在可移植 SQL 中包含特定于 PostgreSQL 的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6900723/

相关文章:

scala - 高级类型成员声明之间的区别

sql - 将列的数据类型更改为串行

sql - 在 Postgres Server 中将正数据转换为负数据(整列)

c++ - 为什么逗号在 C++ 可变函数声明中是可选的?

每条记录和按月分组的 SQL Snowflake 最短日期

postgresql - 从批处理中执行 psql 命令而无需单独的密码弹出窗口?

oop - 用于将自定义对象作为参数传递的 OCaml 语法

java - 如何使用 jOOQ 在 PostGIS 中选择多边形内的点?

java - 插入时间并计算差异的最佳mysql语句

sql - 如何在三个不同的表中并行插入数据