有时我需要在表中插入一些空值,或将它们的值设置为NULL进行更新。
我在Postgres文档中看到过这样的说法,即不能这样做,但可以通过默认值进行欺骗。
我在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值不相等并且可以共存。
'null'
为null
,这并不是它的错。此外,根据我的个人经验,与其他一些关系型数据库管理系统相比,如MSSQL、MySQL、Oracle、Derby和SQLite等,PgSQL引起的问题更少。 - Tomislav Nakic-Alfirevicpg_exec
已被替换为pg_query
,官方文档中的示例引用了pg_execute
。@quassnoi也许你可以更新一下你的答案。 - EAmez