Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Проблема UPDATE другие строчки / 7 сообщений из 7, страница 1 из 1
17.10.2019, 00:59
    #39877359
Legi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема UPDATE другие строчки
Всем добрый вечер!

Столкнулся с проблемой и пока не понимаю куда именно копать (в код, в настройки таблиц, в настройки БД или еще куда?).

Дано:
1) Самая обычная таблица
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE TABLE person.tbl_users
(
    user_id integer NOT NULL,
    user_email text COLLATE pg_catalog."default" NOT NULL,
    user_name text COLLATE pg_catalog."default" NOT NULL,
    date_last_upd timestamp(4) without time zone NOT NULL,
    date_ins timestamp(4) without time zone NOT NULL,
    isd integer NOT NULL DEFAULT 0,
    user_type integer NOT NULL,
    CONSTRAINT "TBL_USERS_pkey" PRIMARY KEY (user_id),
    CONSTRAINT "FK_USER_TYPE" FOREIGN KEY (user_type)
        REFERENCES person.tbl_user_type (user_type_id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
)
WITH (
    OIDS = FALSE
)


Есть еще таблица расширение с атрибутами:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE TABLE person.tbl_user_attr
(
    ua_id integer NOT NULL,
    ua_attr_id integer NOT NULL,
    ua_user_id integer NOT NULL,
    ua_attr_value text COLLATE pg_catalog."default",
    CONSTRAINT "TBL_USER_ATTR_pkey" PRIMARY KEY (ua_id),
    CONSTRAINT "FK_USER_ID" FOREIGN KEY (ua_user_id)
        REFERENCES person.tbl_users (user_id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION,
    CONSTRAINT "FK_USER_TYPE_ID" FOREIGN KEY (ua_attr_id)
        REFERENCES person.tbl_user_attr_type (ua_type_id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
)
WITH (
    OIDS = FALSE
)


2) Есть две функции, которые написаны PLpgSQL.
В одной у меня (упрощаем) банально идет INSERT в основную таблицу и в таблицу расширение:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
...
v_new_user_id = (SELECT nextval('person.seq_user_id'));
INSERT INTO person."tbl_users"(user_id, user_email, user_name, date_last_upd, date_ins, isd, user_type)
	VALUES (v_new_user_id, v_par_email, v_par_email, TIMESTAMP(0) 'now', TIMESTAMP(0) 'now', 0, 1);
insert into person."tbl_user_attr" ("ua_id","ua_attr_id","ua_user_id","ua_attr_value")
    VALUES(nextval('public.seq_attr_id'),16,v_new_user_id,'true');
...


Вторая, в случае редактирование атрибутов (вторая таблица):
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
...
UPDATE person.tbl_user_attr
SET ua_attr_value = par_attr_value
WHERE ua_user_id = par_user_id and ua_attr_id = 11;
...
--проапдейтили значения по конкретному par_user_id и теперь обновить поле даты последнего изменения в первой таблице
UPDATE person.tbl_users
SET date_last_upd= TIMESTAMP(0) 'now'
WHERE user_id = par_user_id and isd = 0;



И в данных первой таблицы я ПЕРИОДИЧЕСКИ вижу, что значения полей с датами (date_last_upd и date_ins ) имеют идентичные значения у нескольких строк соседних (от 2 до 6 строк).

user_iddate_last_upddate_ins2662019-10-16 14:48:092019-10-16 14:13:212652019-10-16 14:50:542019-10-16 14:13:212642019-10-14 17:17:402019-10-14 17:17:482632019-10-14 17:17:402019-10-14 17:17:482622019-10-14 17:17:482019-10-14 17:17:48

В чём может быть проблема? куда копать? Нужен хелп)

Код я пересмотрел несколько раз, ошибочных "не туда" UPDATE не делаю.
...
Рейтинг: 0 / 0
17.10.2019, 09:29
    #39877433
Anatoly B
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема UPDATE другие строчки
Legi,

now - Текущая дата и время (на момент начала транзакции);
Полагаю использовать clock_timestamp() вместо TIMESTAMP(0) 'now' будет более корректно.
...
Рейтинг: 0 / 0
17.10.2019, 10:10
    #39877453
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема UPDATE другие строчки
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
melkij=> create table dt (t timestamptz);
CREATE TABLE
melkij=> create function dttest() returns void language plpgsql as $$ begin
melkij$> insert into dt values (TIMESTAMP(0) 'now');
melkij$> end;
melkij$> $$;
CREATE FUNCTION
melkij=> select now(), dttest();
              now              | dttest 
-------------------------------+--------
 2019-10-17 10:04:40.891426+03 | 
(1 строка)

melkij=> select now(), dttest();
              now              | dttest 
-------------------------------+--------
 2019-10-17 10:04:42.666203+03 | 
(1 строка)

melkij=> select now(), dttest();
              now              | dttest 
-------------------------------+--------
 2019-10-17 10:04:45.745877+03 | 
(1 строка)

melkij=> table dt;
           t            
------------------------
 2019-10-17 10:04:41+03
 2019-10-17 10:04:41+03
 2019-10-17 10:04:41+03



TIMESTAMP(0) 'now' - литерал константы. Он вычисляется один раз при разборе текста функции. И это ещё кэш хранимых процедур индивидуальный на каждый backend. Попробуйте записать такое в view - и в самом view будет дата создания view всегда.

Выберите функцию по вкусу: https://www.postgresql.org/docs/current/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT
И обратите внимание на Tip в конце раздела, это как раз про то самое.
...
Рейтинг: 0 / 0
20.10.2019, 23:26
    #39879020
Legi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема UPDATE другие строчки
Спасибо за ответы.
Пока остановился на этом
Код: plsql
1.
clock_timestamp()



понаблюдаю по результатам.
...
Рейтинг: 0 / 0
25.10.2019, 15:29
    #39881633
Legi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема UPDATE другие строчки
Делюсь апдейтом наблюдений - пока полет нормальный и подобных проблем не испытываю.

Так же перешел на дату\время текущие не от транзакции, а от текущего момента в других местах - тоже подобная проблема вроде бы ушла.

На случай, если кто-то искал решение по аналогичной проблеме.
...
Рейтинг: 0 / 0
04.06.2020, 14:30
    #39966152
MacArrow
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема UPDATE другие строчки
Anatoly B
Legi,

now - Текущая дата и время (на момент начала транзакции);
Полагаю использовать clock_timestamp() вместо TIMESTAMP(0) 'now' будет более корректно.


Добрый день!
Наткнулся на этот пост и задумался...
Я в ПГ не так давно... И по неопытности в default, insert и update использую current_timestamp, а не рекомендованный тут clock_timestamp().
Подскажите, есть ли у current_timestamp какие-то "подводные камни"? Или можно смело его юзать? А что юзать из этих двух, это уже дело вкуса? Или всё-таки есть какие-то преимущества?
Заранее благодарен за разъяснения.
...
Рейтинг: 0 / 0
04.06.2020, 14:44
    #39966155
MacArrow
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема UPDATE другие строчки
MacArrow
Anatoly B
Legi,

now - Текущая дата и время (на момент начала транзакции);
Полагаю использовать clock_timestamp() вместо TIMESTAMP(0) 'now' будет более корректно.


Добрый день!
Наткнулся на этот пост и задумался...
Я в ПГ не так давно... И по неопытности в default, insert и update использую current_timestamp, а не рекомендованный тут clock_timestamp().
Подскажите, есть ли у current_timestamp какие-то "подводные камни"? Или можно смело его юзать? А что юзать из этих двух, это уже дело вкуса? Или всё-таки есть какие-то преимущества?
Заранее благодарен за разъяснения.

Самоответ))
Подводный камень:
current_timestamp = timestamp with time zone = Текущая дата и время ( на момент начала транзакции )

В принципе мне не очень критично, а возможно даже и больше подходящее... Но придётся теперь учитывать.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Проблема UPDATE другие строчки / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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