Postgresql:在使用预准备语句插入和更新行时使用'NULL'值

Str*_*rae 3 php postgresql null prepared-statement

有时我需要在表中插入一些空值,或更新它们将值设置为NULL.

我这个不能做PostgreSQL文档在其他地方见过,但可以tricket使用默认值:

pg_query("INSERT INTO my_table (col_a, col_b) VALUES ('whatever', default)
Run Code Online (Sandbox Code Playgroud)

ps:我知道在这个例子中我会得到相同的结果

pg_query("INSERT INTO my_table (col_a) VALUES ('whatever')
Run Code Online (Sandbox Code Playgroud)

但问题来自准备好的陈述:

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.
Run Code Online (Sandbox Code Playgroud)

更新查询也会出现同样的问题.

我认为有一个解决方案,因为pgmyadmin可以做到(或者看起来像它可以),并且我写的是php(我不认为它不会使用准备好的语句)

如果你想知道为什么我需要在我的表中使用空值,让我举一个例子(也许有一个比null值更好的方法):假​​设我有用户表,并且电子邮件col:这个可以为空,但是是唯一的索引.2空电子邮件是相同的并且违反了唯一约束,而2个NULL值不相等并且可以共存.

Qua*_*noi 5

使用php's literal NULL作为参数:

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));
Run Code Online (Sandbox Code Playgroud)

  • 哦,那是不值得的...... PgSQL没有错,它无法读取开发人员的想法并插入`null`而不是''null'.此外,根据我自己的经验,PgSQL比我使用过的任何其他RDBMS引起的问题更少:MSSQL,MySQL,Oracle,Derby,SQLite,仅举几例...... (3认同)