
Anton
15.12.2016
13:22:24

Pavel
15.12.2016
13:23:01
select txid_current();
SELECT datname, datfrozenxid FROM pg_database where datname='db';

Anton
15.12.2016
13:24:13
[local]:6432 postgres@lsd=# select txid_current();
txid_current
--------------
314895769
(1 row)
Time: 1.554 ms
[local]:6432 postgres@lsd=# SELECT datname, datfrozenxid FROM pg_database where datname='lsd';
datname | datfrozenxid
---------+--------------
lsd | 280759743
(1 row)

Google

Павел П.
15.12.2016
13:31:29
RU SQL
SQL и разработка
https://telegram.me/ru_sql

Pavel
15.12.2016
13:32:22

Александр
15.12.2016
13:33:09
9.4.9 версия

Славик
15.12.2016
14:35:25
как в pgadmin сделать айдишку autoincrement?
и дату current_timestamp

Anton
15.12.2016
14:43:44
create table tt ( id serial, cur_date timestamp default now());

Славик
15.12.2016
19:44:27
как сделать upsert в pg 9.6?
http://www.the-art-of-web.com/sql/upsert/
это выглядит очень страшно
попроще вариантов нет?

Darafei
15.12.2016
19:46:13

raksita
15.12.2016
19:46:51

Славик
15.12.2016
19:47:05
да сложно

Google

Славик
15.12.2016
19:47:14
даете пример
у меня уникальная айдишка
insert into table (...) values (...)
что дальше писать?

Darafei
15.12.2016
19:48:26
то есть доскроллить до примеров в доке сложно? :)

Славик
15.12.2016
19:49:38
on conflict (id) do update set ...?

Darafei
15.12.2016
19:50:31
прочитай надпись над этим примером. это описание тебе подходит? :)

Quet
15.12.2016
19:50:46
для этого видимо надо уметь читать…

Славик
15.12.2016
19:51:00
вот да
чего добиваетесь
признания, что не умею читать?
я не умею читать
дайте мне готовое

Quet
15.12.2016
19:51:35
уже бежим давать готовое )

Славик
15.12.2016
19:51:42
сразу бы

Евгений
16.12.2016
08:24:49
ну скажем прямо UPSERT сделан "слегка" по-идиотски:
1. допускается нарушение только одного контстрейнта, а если у меня кроме PK есть еще другие uniq поля?
2. при этом требуется указание нарушенного констрейнта.
Зачем?
То есть выглядит как будто заготовка под множественную проверку наруленных условий. Ищещь их в доке. А "никакого суслика нет".

Denis
16.12.2016
08:28:06
а вроде же как раз наоборот

Евгений
16.12.2016
08:28:12
Ну то есть вот что можно сделать:
INSERT INTO distributors (did, dname) VALUES (7, 'Redline GmbH')
ON CONFLICT (did) DO NOTHING;
А что нужно уметь:
INSERT INTO distributors (did, dname) VALUES (7, 'Redline GmbH')
ON CONFLICT (did) DO NOTHING
ON CONFLICT (dname) DO UPDATE SET dname=EXCLUDED.dame
и т.п.

Kirill
16.12.2016
08:41:09
для вашего случая давно есть begin exception when, но юзкейс какой-то у вас в примере странный

Google

Евгений
16.12.2016
09:06:01
Ну да, есть такая ерунда, которую еще с 8.х юзал. Но хочется нормальных запросов, а не давайте попробуем обновить, а если не получилось, то вставить, а если снова не получилось, то пще раз обновим.
Да, пример немного странный - из доки + добавлено.
Но юз-кейс совершенно нормальный - разные проверки на уникальность по разным критериям и разные действия в итоге.
Ну и не нравится, что для единственной проверки надо указавать имя PK - это усложняет запрос и заставляет заниматься копи-пастой

Sergey
16.12.2016
09:31:17

Евгений
16.12.2016
09:32:22
я не использую в колонках, только в констрейнатх - для уникальности и для удобства, чтобы понимать где какой констрейт
но ведь PK это не всегда колонка id.
он может быть и составной

Sergey
16.12.2016
09:38:54
Я пони. Для этого у меня тоже префиксы типа pk_xxxxxx

Александр
16.12.2016
09:39:05
O_o

Kirill
16.12.2016
11:27:32

Евгений
16.12.2016
11:33:07

Kirill
16.12.2016
11:38:53
BEGIN
INSERT INTO table (
...
) VALUES (
...
);
EXCEPTION WHEN OTHERS THEN
GET STACKED DIAGNOSTICS
_constraint_name = constraint_name;
CASE
WHEN _constraint_name = 'pk' THEN
-- primary key
WHEN _constraint_name = 'uidx' THEN
-- another key
ELSE
....
END CASE;

Евгений
16.12.2016
11:40:01
Ясно. Спасибо.
Очень лохмато, конечно. И получается сам UPSERT-то и не используется.

Славик
16.12.2016
11:40:59
+

Kirill
16.12.2016
11:43:49
upsert хорошь когда есть что-то вроде
create table cnt(
key uniq,
count int default 0
);
insert into cnt (key) values (a),(b),(c) on conflict key do update count ++

Alexey
16.12.2016
11:47:23

Kirill
16.12.2016
11:48:28
это PL/pgSQL там begin не начало транзакци, читайте как try catch

Alexey
16.12.2016
11:51:25
Понятно, т.е. функцию такую можно сделать

Kirill
16.12.2016
11:53:49
можно, а можно просто в
DO $$
-- PL/pgSQL code
$$;

Alexey
16.12.2016
11:55:41
Круто, я ж прав, что вы имеете ввиду, что это можно выполнить без явного создания функции?)

Kirill
16.12.2016
11:56:06
да

Google

Alexey
16.12.2016
11:56:18
Спасибо, супер ?

Darafei
16.12.2016
12:00:59
а в https://pgconf.ru/ залогиниться не удаётся

Admin
ERROR: S client not available

Darafei
16.12.2016
12:01:08
это только у меня такая проблема?

Евгений
16.12.2016
12:13:05

Kirill
16.12.2016
12:14:42
https://www.postgresql.org/list/pgsql-general/

Vadim
16.12.2016
12:29:45

Alexey
16.12.2016
12:41:36
Ну я согласен ,что иметь такой код:
insert into ... values ()
on conflict (a) do ...
on conflict (b) do ...
on conflict (c) do ...
было бы удобней
чем это https://gist.github.com/Logioniz/c781671d80acb9d6b512e4b9d9ea6e32
Ещё у меня возникают ситуации, когда после такого кода:
insert into ... values (...)
on conflict (a) do ...
returning id
Хочется получить id всегда на выходе
Как бы тоже могли такую возможность дать...


Evgeniy
16.12.2016
13:53:37
господа
у меня есть лог файлик с форматом
2016-12-16 00:02:01 UTC LOG: duration: 1700.735 ms execute <unnamed>: UPDATE pegamkt.DISPATCHTOSENDSAY SET senderid = $1, status = $2 WHERE status= 'New' AND (interactionid, treatmentname) IN ( SELECT s.interactionid, s.treatmentname FROM pegamkt.DISPATCHTOSENDSAY s, (SELECT programmrunid ,treatmentname FROM pegamkt.DISPATCHTOSENDSAY WHERE status= 'New' AND interactionid IS NOT NULL limit 1) pid WHERE s.status= 'New' AND s.interactionid IS NOT NULL AND s.programmrunid = pid.programmrunid AND s.treatmentname = pid.treatmentname limit 10000)
2016-12-16 00:02:01 UTC DETAIL: parameters: $1 = 'be11e13d-91bc-4421-8b4d-6405d24b7082', $2 = 'Pending-CustomerRegistration'
запускаю pgbadger --prefix '%t '
он не видит update запроса
что я делаю не так?

Alexander
16.12.2016
14:57:13
не туда =(

blkmrkt
16.12.2016
15:22:45
я вот думаю в одном проекте с постгреса уйти, т.к. мне консистенси не очень важна, да и вместо нормализованных данных удобнее было бы хранить кучу жсона который очень активно апсертится, данные больше для nosql подходят. И постгрес довольно много места съедает если не делать полный vacuum.
Не подскажете какой другой движок?

Mike Chuguniy
16.12.2016
15:23:44

Andrey
16.12.2016
15:24:47
Хранить недекомпонованный JSON вместо нормализованных данных - это хипстерство и похапе какое-то
Уверен, если сделать человеческую декомпозицию, блоат будет гораздо менее страшным
Но для этого нужно выгнать хипстеров из девелопмента.

blkmrkt
16.12.2016
15:28:50

Google

Alexey
16.12.2016
15:29:48
Что кто его знает? Версия растёт только вверх, в старых версиях всю историю ничего не менялось.

blkmrkt
16.12.2016
15:31:46
плюс основная масса данных это диффы тех самых json документов, что-то наподобе audit table. Если например поменялось лишь 1 поле из 100, то я думаю неоптимально класть новую запись в аудит таблицу с NULL в остальных полях, да и не знаю какую правильную схему для этого подобрать
у меня сейчас аудит таблица состоит из записей (id::int, timestamp, diff::jsonb)

Sergey
16.12.2016
15:32:48
Запили отдельную таблу с объект UUID, чейнджед филд и превиус велью

blkmrkt
16.12.2016
15:32:58

Sergey
16.12.2016
15:33:05
храти тока измененные проперти
вернее предыдущее значение измененных полей

blkmrkt
16.12.2016
15:34:27

Sergey
16.12.2016
15:36:12
Я nvarchar бахнул туда (да, я еще на MS SQL). На перфоманс пофиг, тк смысл аудита - логирование. А инсерт операции быстро проходят
Критика, как обычно, приветствуется

blkmrkt
16.12.2016
15:37:33