2015-10-04 99 views
0

我正在处理一个php脚本,它将数据编译为postgresql数据库的插入语句。它最初是为mysql数据库编写的,所以当然有一些差异。postgresql不喜欢多个逗号

有一件事我碰到,我似乎无法弄清楚,是PostgreSQL的不喜欢这种类型的语句:

INSERT INTO table (col1, col2, col3, col4) VALUES ('value',,'value','value'); 

任何有缺失值时,查询在犯错点的双重逗号。

关于如何绕过这个任何想法?这些字段都有不同的数据类型,所以使用''作为填充符会失败,如果col期望int。

回答

3

PostgreSQL在这里遵循SQL标准。你的陈述是无效的,所以它会产生一个错误。

您必须:

  • 动态生成列名列表,只包括你要设置列;或
  • 使用关键字DEFAULT说“做你会做,如果我没有指定这个栏”

    INSERT INTO table (col1, col2, col3, col4) 
    VALUES ('value',DEFAULT,'value','value'); 
    

注意,DEFAULT关键字不引用了。它不是一个标识符或文字。这是一个关键字,必须不加引号。这意味着无法通过大多数参数化语句查询接口将其作为查询参数传递。

这意味着无论哪种方式,您都会遇到动态SQL。

我认为这是大多数SQL客户端接口中的一个真正的缺陷,它应该提供一个通用对象,您可以通过它来指定“使此列成为默认字段”或方法setDefault(paramname)或类似方法。不幸的是,这不会对你有所帮助,因为他们大多数人不这样做。

可以通过NULL作为占位符,如果列可以为空,但这不是传递DEFAULT。如果您使用DEFAULT关键字,则使用该列上的任何DEFAULT表达式,就好像您根本没有指定该列。如果使用NULL,则列定义上的任何DEFAULT表达式都将被覆盖并被忽略。

+0

我觉得'NULL'会成为我的选择,但我遇到了另一个问题。如何判断我读的单元格是否空白。我试过'if($ cell ==''或$ cell =='')',但它没有捕获缺失的值。 – KingRichard

+0

NULL不是空字符串 - 不在ANSI SQL数据库上。 –

+1

空字符串'',一个带有单个空格的字符串''和NULL是不同的东西。你必须测试'column IS NULL'或'IS NOT NULL' - 你不能使用'= NULL'。有关原因,请参阅介绍性数据库理论手册或postgresql手册。你还应该阅读关于连接和规范化。 –