powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вот головоломка! Вставить значение из последовательности сразу в два поля
12 сообщений из 12, страница 1 из 1
Вот головоломка! Вставить значение из последовательности сразу в два поля
    #39159233
PCContra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица 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 после вставки не желательно

--
Россия - отличная страна!
...
Рейтинг: 0 / 0
Вот головоломка! Вставить значение из последовательности сразу в два поля
    #39159240
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PCContra,

Код: sql
1.
2.
3.
4.
5.
INSERT INTO table (id, a)
SELECT
  v, v
FROM
  nextval(sequence) AS v
...
Рейтинг: 0 / 0
Вот головоломка! Вставить значение из последовательности сразу в два поля
    #39159242
PCContra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lonepsycho,
Хорошо!
А как теперь вставить это значение в d на позицию "0" ? смотрю тут
http://www.postgresql.org/docs/9.5/static/functions-json.html
Во-первых, наверное, надо разобрать d на составные части, поменять значение, затем собрать.
Вот смотрю функции row_to_json, и другие...
Есть какие догадки?
...
Рейтинг: 0 / 0
Вот головоломка! Вставить значение из последовательности сразу в два поля
    #39159308
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PCContra,

я бы пробовал делать с помощю jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean]). а если нет, так селектил бы из json_to_recordset(json) и собирал при помощи json_build_object или чего либо похожего на него.
...
Рейтинг: 0 / 0
Вот головоломка! Вставить значение из последовательности сразу в два поля
    #39159767
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Оперировать со счетчками (по моему мнению), типа nextval, currval, это хорошо когда вы одни в базе.
Так как поведение счетчиков не транзакционно, то всегда существует вероятность, что при конкурентных запросах можно получить расхождение между тем значением, которое вы вставите в json и первичным ключом.
Наиболее надежным способом это после insert выполнить update (для вас этот вариант, как вы сами говорите, нежелательный).
...
Рейтинг: 0 / 0
Вот головоломка! Вставить значение из последовательности сразу в два поля
    #39159792
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-trot,

даже при явном использовании того же значения для ид? как так? как они могут разойтись?
...
Рейтинг: 0 / 0
Вот головоломка! Вставить значение из последовательности сразу в два поля
    #39159816
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lonepsycho,
Lonepsycho,даже при явном использовании того же значения для ид? как так? как они могут разойтись?

Например для двух транзакций при вставке в одну и туже таблицу счетчик является разделяемым ресурсом, т.е. вы не можете контролировать в своей транзакции изменения, происходящие в счетчике, вызванные другой транзакцией. snapshot счётчика не делается и откатов в счётчике нету.
Если это не так то меня может кто-нибудь поправит.
...
Рейтинг: 0 / 0
Вот головоломка! Вставить значение из последовательности сразу в два поля
    #39159843
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-trot,

то что счётчик работает вне транзакции, мне это известно. но если уж забрали значение из счётчика, как оно может изменится до комита? то что счётчик работает вне транзакции, значит только одно (на сколько мне известно) - что при ROLLBACK, текущее значение небудет возвращатся в прежнее, то что было до BEGIN, т.е. исход транзакции на него не влияет, как в некоторых файловых системах имеющих интерфейс с емуляцией SQL языка. но уникальность значений для каждого из соединений, и даже для каждого запроса он гарантирует.
...
Рейтинг: 0 / 0
Вот головоломка! Вставить значение из последовательности сразу в два поля
    #39159885
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PCContra,

а почему бы это не сделать в before insert триггере?
...
Рейтинг: 0 / 0
Вот головоломка! Вставить значение из последовательности сразу в два поля
    #39159902
PCContra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexiusPCContra,

а почему бы это не сделать в before insert триггере?
Можно и в триггере, но я сделал простенько: Одним запросом сделал SELECT из последовательности, значение вернул в php, изменил $d, вторым запросом вставил явное значение в первичный ключ и значение $d в d
INSERT INTO t (rc, d) VALUES ($rc, '$d'::JSON)
Чем проще, тем лучше
...
Рейтинг: 0 / 0
Вот головоломка! Вставить значение из последовательности сразу в два поля
    #39159903
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.

Вот нашел в документации. Для сеанса уникальность значения последовательности гарантирована. Был не во всём прав.
...
Рейтинг: 0 / 0
Вот головоломка! Вставить значение из последовательности сразу в два поля
    #39160074
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вот головоломка! Вставить значение из последовательности сразу в два поля
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]