|
|
|
Вот головоломка! Вставить значение из последовательности сразу в два поля
|
|||
|---|---|---|---|
|
#18+
Есть таблица t(rc SERIAL PRIMARY KEY, d JSON) делаю вставку INSERT INTO t (d) VALUES ('$d'::JSON) где $d = {"0":"1", "1":"text"} Вот только на момент вставки у переменной d значение для нуля не задано ("0":"?") Здесь бы вместо знака вопроса надо вставить тоже значение, что и вставляется в первичный ключ rc, т.е. что берется из последовательности t_rc_seq Что я пробовал сделать: Искал в сторону currval отсюда: http://www.postgresql.org/docs/current/static/functions-sequence.html но это во-первых для сессии, т.е перед вставкой ее вроде как вызывать нельзя, а во-вторых, как поменять значение переменной d::JSON на лету для индекса ноль - не понятно. Хорошо, хоть, что значение первичного ключа всегда надо вставлять для нулевого индекса переменной d примечание: делать update после вставки не желательно -- Россия - отличная страна! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2016, 17:36 |
|
||
|
Вот головоломка! Вставить значение из последовательности сразу в два поля
|
|||
|---|---|---|---|
|
#18+
PCContra, Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2016, 18:08 |
|
||
|
Вот головоломка! Вставить значение из последовательности сразу в два поля
|
|||
|---|---|---|---|
|
#18+
Lonepsycho, Хорошо! А как теперь вставить это значение в d на позицию "0" ? смотрю тут http://www.postgresql.org/docs/9.5/static/functions-json.html Во-первых, наверное, надо разобрать d на составные части, поменять значение, затем собрать. Вот смотрю функции row_to_json, и другие... Есть какие догадки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2016, 18:24 |
|
||
|
Вот головоломка! Вставить значение из последовательности сразу в два поля
|
|||
|---|---|---|---|
|
#18+
PCContra, я бы пробовал делать с помощю jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean]). а если нет, так селектил бы из json_to_recordset(json) и собирал при помощи json_build_object или чего либо похожего на него. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2016, 22:08 |
|
||
|
Вот головоломка! Вставить значение из последовательности сразу в два поля
|
|||
|---|---|---|---|
|
#18+
Оперировать со счетчками (по моему мнению), типа nextval, currval, это хорошо когда вы одни в базе. Так как поведение счетчиков не транзакционно, то всегда существует вероятность, что при конкурентных запросах можно получить расхождение между тем значением, которое вы вставите в json и первичным ключом. Наиболее надежным способом это после insert выполнить update (для вас этот вариант, как вы сами говорите, нежелательный). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2016, 08:47 |
|
||
|
Вот головоломка! Вставить значение из последовательности сразу в два поля
|
|||
|---|---|---|---|
|
#18+
big-trot, даже при явном использовании того же значения для ид? как так? как они могут разойтись? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2016, 09:29 |
|
||
|
Вот головоломка! Вставить значение из последовательности сразу в два поля
|
|||
|---|---|---|---|
|
#18+
Lonepsycho, Lonepsycho,даже при явном использовании того же значения для ид? как так? как они могут разойтись? Например для двух транзакций при вставке в одну и туже таблицу счетчик является разделяемым ресурсом, т.е. вы не можете контролировать в своей транзакции изменения, происходящие в счетчике, вызванные другой транзакцией. snapshot счётчика не делается и откатов в счётчике нету. Если это не так то меня может кто-нибудь поправит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2016, 09:57 |
|
||
|
Вот головоломка! Вставить значение из последовательности сразу в два поля
|
|||
|---|---|---|---|
|
#18+
big-trot, то что счётчик работает вне транзакции, мне это известно. но если уж забрали значение из счётчика, как оно может изменится до комита? то что счётчик работает вне транзакции, значит только одно (на сколько мне известно) - что при ROLLBACK, текущее значение небудет возвращатся в прежнее, то что было до BEGIN, т.е. исход транзакции на него не влияет, как в некоторых файловых системах имеющих интерфейс с емуляцией SQL языка. но уникальность значений для каждого из соединений, и даже для каждого запроса он гарантирует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2016, 10:30 |
|
||
|
Вот головоломка! Вставить значение из последовательности сразу в два поля
|
|||
|---|---|---|---|
|
#18+
PCContra, а почему бы это не сделать в before insert триггере? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2016, 10:54 |
|
||
|
Вот головоломка! Вставить значение из последовательности сразу в два поля
|
|||
|---|---|---|---|
|
#18+
AlexiusPCContra, а почему бы это не сделать в before insert триггере? Можно и в триггере, но я сделал простенько: Одним запросом сделал SELECT из последовательности, значение вернул в php, изменил $d, вторым запросом вставил явное значение в первичный ключ и значение $d в d INSERT INTO t (rc, d) VALUES ($rc, '$d'::JSON) Чем проще, тем лучше ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2016, 11:15 |
|
||
|
Вот головоломка! Вставить значение из последовательности сразу в два поля
|
|||
|---|---|---|---|
|
#18+
Lonepsycho, авторFurthermore, although multiple sessions are guaranteed to allocate distinct sequence values, the values might be generated out of sequence when all the sessions are considered. Вот нашел в документации. Для сеанса уникальность значения последовательности гарантирована. Был не во всём прав. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2016, 11:16 |
|
||
|
Вот головоломка! Вставить значение из последовательности сразу в два поля
|
|||
|---|---|---|---|
|
#18+
big-trot, RTFM http://www.postgresql.org/docs/current/static/functions-sequence.html currval Return the value most recently obtained by nextval for this sequence in the current session . (An error is reported if nextval has never been called for this sequence in this session.) Because this is returning a session-local value, it gives a predictable answer whether or not other sessions have executed nextval since the current session did. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2016, 13:18 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=39159233&tid=1997481]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
32ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 248ms |
| total: | 347ms |

| 0 / 0 |
