我想编写一个SQL脚本,它将在默认安装的MySQL或PostgreSQL(分别是版本5.5和9.0)上运行。这可能吗?
我几乎可以通过将SET SESSION sql_mode='ANSI';
添加到脚本的开头并使用标准ANSI查询来实现,但该行对PostgreSQL无效。我可以告诉PostgreSQL继续出错,但是让脚本运行没有错误会很好。
答案 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)
我认为您正在进行一对一的功能比较。我没有阅读整个链接,但我认为它可能对您的任务有用。
答案 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;
,也很有帮助。