我正在使用php脚本将数据编译为postgresql数据库的insert语句。它最初是为mysql数据库编写的,所以当然也存在一些差异。
我遇到的一件事似乎无法弄清楚,postgresql不喜欢这种声明:
INSERT INTO table ( col1, col2, col3, col4 ) VALUES ( 'value',,'value','value' );
任何时候缺少值,查询都会在双逗号处出错。
关于如何绕过这个的任何想法?这些字段都具有不同的数据类型,因此如果col期望int,则使用''作为填充符会失败。
答案 0 :(得分:3)
PostgreSQL遵循SQL标准。您的陈述无效,因此会产生错误。
您必须:
使用关键字DEFAULT
说“如果我没有指定此列,请执行任何操作”
e.g
INSERT INTO table ( col1, col2, col3, col4 )
VALUES ( 'value',DEFAULT,'value','value' );
请注意,DEFAULT
关键字未引用。它不是标识符或文字。这是一个关键字,必须不加引号。这意味着无法通过大多数参数化语句查询接口将其作为查询参数传递。
这意味着无论哪种方式,你都会遇到动态SQL。
我认为这是大多数SQL客户端界面中的一个真正的缺陷,它应该提供一个通用对象,您可以传递以指定“将此列设为默认字段”,或setDefault(paramname)
方法或类似方法。不幸的是,这对你没有帮助,因为大多数人都没有这样做。
如果列可以为空,则可以传递NULL
作为占位符,但这与传递DEFAULT
不同。如果您使用DEFAULT
关键字,则会使用列上的任何DEFAULT
表达式,就好像您根本没有指定列一样。如果您使用NULL
,则会覆盖并忽略列定义中的任何DEFAULT
表达式。