Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вот головоломка! Вставить значение из последовательности сразу в два поля / 12 сообщений из 12, страница 1 из 1
30.01.2016, 17:36
    #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
30.01.2016, 18:08
    #39159240
Lonepsycho
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вот головоломка! Вставить значение из последовательности сразу в два поля
PCContra,

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

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

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

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

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

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

а почему бы это не сделать в before insert триггере?
Можно и в триггере, но я сделал простенько: Одним запросом сделал SELECT из последовательности, значение вернул в php, изменил $d, вторым запросом вставил явное значение в первичный ключ и значение $d в d
INSERT INTO t (rc, d) VALUES ($rc, '$d'::JSON)
Чем проще, тем лучше
...
Рейтинг: 0 / 0
01.02.2016, 11:16
    #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
01.02.2016, 13:18
    #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
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вот головоломка! Вставить значение из последовательности сразу в два поля / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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