是否可以为MySQL和PostgreSQL编写SQL脚本?

时间:2011-02-15 17:10:04

标签: mysql postgresql sql-scripts ansi-sql

我想编写一个SQL脚本,它将在默认安装的MySQL或PostgreSQL(分别是版本5.5和9.0)上运行。这可能吗?
我几乎可以通过将SET SESSION sql_mode='ANSI';添加到脚本的开头并使用标准ANSI查询来实现,但该行对PostgreSQL无效。我可以告诉PostgreSQL继续出错,但是让脚本运行没有错误会很好。

5 个答案:

答案 0 :(得分:4)

  

是否可以为MySQL和PostgreSQL编写SQL脚本?

下一个问题,拜托!

...

好吧,严肃地说,这完全是可行的,但是你必须要注意每个人做不同的事情。例如,如果您需要在PG中使用bytea,而在MySQL中使用BLOB,那么您将非常有趣地获得正确的编码/转义。然后有全文搜索之类的东西。 PG内置了它,MySQL只内置了一种表类型(MyISAM,sucky),语法完全不同。而这甚至不会触及字符集和排序。

如果你只限于简单的CRUD操作,那么你可能会很高兴。哎呀,如果你已经完成了你的工作,你也可以使用相同的代码与SQLite和MSSQL交谈(当切换到ANSI模式时)。

一旦你变得中等复杂,你的代码至少需要意识到底层数据库才能解决小的行为和语法差异。重要的是,您可以在基础数据库之间共享大多数查询,而无需进行任何修改如果您正确构建它们。

答案 1 :(得分:3)

尝试使用条件评论:

/*! SET SESSION sql_mode='ANSI'; */

PostgreSQL将忽略它,MySQL将运行它。有关详细信息,请参阅the docs

更新:如果您想要包含仅在PostgreSQL上运行而不在MySQL上运行的命令,您可以利用PostgreSQL支持嵌套注释的事实,而MySQL则不会。以下示例显示了如何使用它:

/*! SELECT 'MySQL' rdbms_type; */
/*/**/-- */ SELECT 'postgres' AS rdbms_type;

但这可能会使文件难以阅读。

答案 2 :(得分:1)

我认为您正在进行一对一的功能比较。我没有阅读整个链接,但我认为它可能对您的任务有用。

http://troels.arvin.dk/db/rdbms/

答案 3 :(得分:1)

将服务器中的模式设置为不在脚本中:

  

您可以通过使用--sql-mode =“modes”选项启动mysqld,或使用my.cnf(Unix操作系统)或my.ini中的sql-mode =“modes”来设置默认SQL模式(窗口)。

http://dev.mysql.com/doc/refman/5.5/en/server-sql-mode.html

显然在脚本中你将使用最接近的功能的共同支配者。 MySQL也被认为具有最符合标准的兼容解析器,但这并不意味着它实际上意味着它将做任何事情(因为脚本将起作用但行为可能完全不同,所以很好地获得了解决方法)。 Postgresql也不是'ansi'兼容的。它可能是最接近的,但它有很多独特的东西。似乎不是一种理想的方式。

ORM努力做同样的事情 - 消除痛苦。

答案 4 :(得分:0)

添加

SET SESSION sql_mode='ANSI';

没有条件(?)解决了ulogin php库安装问题。 如果您已在命令行中创建了use database;,也很有帮助。