Postgresql: usando il valore 'NULL' quando si inseriscono e si aggiornano le righe con istruzioni preparate
-
06-07-2019 - |
Domanda
a volte ho bisogno di inserire nella tabella alcuni valori nulli o aggiornarli impostando il valore su NULL.
Ho letto da qualche parte nella documentazione di postgresql che questo non può essere fatto, ma può essere tricket con il valore predefinito:
pg_query("INSERT INTO my_table (col_a, col_b) VALUES ('whatever', default)
p.s: so che in questo esempio avrò lo stesso risultato con
pg_query("INSERT INTO my_table (col_a) VALUES ('whatever')
Ma i problemi arrivano con le dichiarazioni preparate:
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.
Lo stesso problema si presenta con la query di aggiornamento.
Penso che ci sia una soluzione, perché pgmyadmin può farlo (o sembra che possa farlo), ed è scritto in php (non credo che non usi comunque le dichiarazioni preparate)
Se ti stai chiedendo perché ho bisogno di paly con valori null nelle mie tabelle, lasciami fare un esempio (forse c'è un modo migliore del valore null): supponi di avere la tabella utente e l'e-mail col: questa può essere vuoto, ma è un indice univoco. 2 e-mail vuote sono uguali e violano il vincolo univoco, mentre 2 valori NULL non sono uguali e possono coesistere.
Soluzione
Utilizza il NULL
letterale del php
come parametro:
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));