在使用准备语句插入或更新时如何处理空值问题

3
有时我需要在表中插入一些空值,或将它们的值设置为NULL进行更新。
我在Postgres文档中看到过这样的说法,即不能这样做,但可以通过默认值进行欺骗。
pg_query("INSERT INTO my_table (col_a, col_b) VALUES ('whatever', default)

在这个例子中,我知道使用以下代码会得到相同的结果:

pg_query("INSERT INTO my_table (col_a) VALUES ('whatever')

但是问题出现在预处理语句中:

pg_prepare($pgconn, 'insert_null_val', "INSERT INTO my_table (col_a, col_b) VALUES ($1, default)");
pg_exec($pgconn, 'insert_null_val', array('whatever'));
//this works, but
pg_prepare($pgconn, 'insert_null_val', "INSERT INTO my_table (col_a, col_b) VALUES ($1, $2)");
pg_exec($pgconn, 'insert_null_val', array('whatever', 'NULL'));
//insert into the table the string 'NULL'.
//instead using array('whatever', '') it assume the col_b as empty value, not NULL.

更新语句也存在同样的问题。

我认为有一个解决方案,因为pgmyadmin可以做到这一点(或者看起来可以)。

如果你想知道为什么我需要在我的表中玩空值,请让我举个例子(也许有比空值更好的方法?):

假设我有一个名为users的表,其中有一个email列,它可以为空,但具有唯一索引。两个空电子邮件是相等的并违反了唯一约束,而两个NULL值不相等并且可以共存。

1个回答

5

使用 php 中的字面量 NULL 作为参数:

pg_prepare($pgconn, 'insert_null_val', "INSERT INTO my_table (col_a, col_b) VALUES ($1, $2)");
pg_query($pgconn, 'insert_null_val', array('whatever', NULL));

1
也许你工作过度或感到压力。如果你使用PgSQL,那也不足为奇。 - analytik
6
哦,那真是冤枉了……PgSQL无法读取开发人员的想法并替换掉 'null'null ,这并不是它的错。此外,根据我的个人经验,与其他一些关系型数据库管理系统相比,如MSSQL、MySQL、Oracle、Derby和SQLite等,PgSQL引起的问题更少。 - Tomislav Nakic-Alfirevic
pg_exec已被替换为pg_query,官方文档中的示例引用了pg_execute。@quassnoi也许你可以更新一下你的答案。 - EAmez
@EAmez:这些天我甚至没有在我的电脑上安装PHP来确保它能正常工作。如果您可以在您的电脑上验证更新后的代码,请随意编辑答案。 - Quassnoi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接