Postgresql: использование значения NULL при вставке и обновлении строк с помощью подготовленных операторов - PullRequest
3 голосов
/ 22 июня 2009

иногда мне нужно вставить в таблицу некоторые нулевые значения или обновить их, установив значение NULL.

Я где-то читал в документации postgresql, что это нельзя сделать, но может быть tricket со значением по умолчанию:

pg_query("INSERT INTO my_table (col_a, col_b) VALUES ('whatever', default)

p.s: я знаю, что в этом примере у меня будет тот же результат с

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.

Та же проблема возникает с запросом на обновление.

Я думаю, что есть решение, becose pgmyadmin может сделать это (или кажется, что может), и написано в php (я не думаю, что оно в любом случае не использует подготовленные операторы)

Если вам интересно, почему мне нужно использовать paly с нулевыми значениями в моих таблицах, позвольте мне привести пример (может быть, есть способ лучше, чем нулевое значение): предположим, у меня есть таблица пользователя и столбец электронной почты: вот этот может быть пустым, но является уникальным индексом. 2 пустых сообщения электронной почты равны и нарушают ограничение уникальности, в то время как значения 2 NULL не равны и могут сосуществовать.

1 Ответ

5 голосов
/ 22 июня 2009

Используйте литерал php 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));
...