Non esiste un modo semplice per json_populate_record
per restituire un indicatore che significa "generare questo valore".
PostgreSQL fa non consente di inserire NULL
per specificare che un valore deve essere generato. Se si chiede NULL
Pg si aspetta mediaNULL
e non si vuole indovinare. Inoltre è perfettamente OK avere una colonna generata che non ha il vincolo NOT NULL
, nel qual caso è perfettamente adatto inserire NULL
in esso.
Se si desidera avere PostgreSQL utilizzare il default tavolo per un valore ci sono due modi per farlo:
- Omettere quella riga dal
INSERT
colonna-list; o
- esplicitamente scrivere
DEFAULT
, che è valido solo in un'espressione VALUES
Dal momento che non è possibile utilizzare VALUES(DEFAULT, ...)
qui, l'unica opzione è quella di omettere la colonna dalla colonna INSERT
-list:
regress=# create table test (id serial primary key, name varchar(50));
CREATE TABLE
regress=# insert into test(name) select name from json_populate_record(NULL::test, '{"name": "John"}');
INSERT 0 1
Sì, questo significa che è necessario elencare le colonne. Due volte, infatti, una volta nell'elenco di SELECT
e una volta nell'elenco di colonne INSERT
.
Per evitare la necessità che tale PostgreSQL avrebbe bisogno di avere un modo per specificare DEFAULT
come valore per un record, quindi json_populate_record
potrebbe ritornare DEFAULT
anziché NULL
per colonne non definiti. Potrebbe non essere quello che intendevi per tutte le colonne e porterebbe alla domanda su comeè stato json_populate_record
non utilizzato in un'espressione INSERT
.
Quindi penso che json_populate_record
potrebbe essere meno utile di quanto speravate per le righe con le chiavi generate.
fonte
2013-07-28 13:34:31
"Ho trovato la funzione' json_populate_record' ". Um. *Dove*? Qual è la definizione della funzione? Stai usando PostgreSQL 9.3 beta, o è una funzione che hai installato da qualche altra parte? –
It's 9.3 beta's function – user2627000