powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Выборка работает, а удаление нет. (Операция с датами)
7 сообщений из 7, страница 1 из 1
Выборка работает, а удаление нет. (Операция с датами)
    #34172094
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не пойму. Почему вот такой запрос отрабатывает (я вижу строки)
Код: plaintext
select * from users where (regdate + '7 days')<now() and user_status=- 2 

А если я хочу удалить их
Код: plaintext
delete from users where (regdate + '7 days')<now() and user_status=- 2 
то ничего не происходит.

regdate timestamp
user_status int2

Кстати, как в pgAdmin увидеть - почему запрос не отработал. Вижу только ошибки. В данном случае их нет. Но ведь он не отрабатывает. Даже не пишет, что удалено 0 строк.
...
Рейтинг: 0 / 0
Выборка работает, а удаление нет. (Операция с датами)
    #34172174
ZemA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У users есть триггеры? Или вообще триггеры каким-то образом связанные в users.
...
Рейтинг: 0 / 0
Выборка работает, а удаление нет. (Операция с датами)
    #34172242
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, триггеров и правил нет.
Я был не прав, что указав в заголовке "операция с датами" не указал в тексте, что, например, по id записи удаляются. Поэтому-то я и решил, что проблема где-то в преобразованиях дат и интервалов.
Вот такое удаление работает

Код: plaintext
delete from users where id= 38  and user_status=- 2 
...
Рейтинг: 0 / 0
Выборка работает, а удаление нет. (Операция с датами)
    #34172614
Jelis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может users это представление а не таблица? Вообще не плохо посмотреть \d users в psql.

Попробуйте, вместо now(), конкретную дату. Ведь now() в селекте это немного не то(самую малость, но все же), что now() в делейте через 20 секунд.

Попробуйте селект и делейт cделать в одной транзакции. Типа
Код: plaintext
1.
2.
3.
4.
5.
begin;
select .... ;
delete ... ;
select ... ;
commit;

И посмотреть будет ли последний селект тоже что-то выдавать. И в место now() в транзакции используйте current_timestamp - их поведение немного отличаеться. А лучше просто, руками, указывайте конкретную датувремя (что б наверняка).

Попробуйте закастить всё.
...
Рейтинг: 0 / 0
Выборка работает, а удаление нет. (Операция с датами)
    #34172630
ZemA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю что проблемма в том что date + interval = timestamp, а now() - timestampz.
Попробуйте так
Код: plaintext
delete from users where (regdate + '7 days')<now()::timestamp and user_status=- 2 
...
Рейтинг: 0 / 0
Выборка работает, а удаление нет. (Операция с датами)
    #34172643
ZemA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только что проверил у себя, проблемм не возникло.
Код: plaintext
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.
32.
33.
34.
35.
36.
select version();
 version(text)
-----------------------------------------------------
PostgreSQL  8 . 1 . 3  on i686-pc-mingw32,
 compiled by GCC gcc.exe (GCC)  3 . 4 . 2  (mingw-special)

CREATE TABLE test
(
  date date NOT NULL,
  status int2 NOT NULL,
  PRIMARY KEY (date, status)
);

insert into test values ('2006-10-12'::date, - 2 );
insert into test values ('2006-10-13'::date, - 2 );
insert into test values ('2006-10-14'::date, - 2 );
insert into test values ('2006-10-15'::date, - 2 );
insert into test values ('2006-11-29'::date, - 2 );

select * from test;

 date (date) | status (int2)
-------------+---------------
  2006 - 10 - 12   | - 2 
  2006 - 10 - 13   | - 2 
  2006 - 10 - 14   | - 2 
  2006 - 10 - 15   | - 2 
  2006 - 11 - 29   | - 2 

delete from test where (date + '7 day'::interval) < now() and status=- 2 ; 

select * from test;

 date (date) | status (int2)
-------------+---------------
  2006 - 11 - 29   | - 2 
...
Рейтинг: 0 / 0
Выборка работает, а удаление нет. (Операция с датами)
    #34172670
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа, убейте меня об стену :о(

вот так сработало
Код: plaintext
delete from users where (regdate + '7 days')<current_timestamp and user_status=- 2  and id!= 34 ;
Сейчас объясню почему.

На таблицу есть внешний ключ из другой таблицы. На боевой базе в той таблице не может быть записей от юзеров со статусом -2 (не активированы), но на тестовой одна запись от юзера 34 оказалась. Она-то все и портила - ломался внешний ключ
НО! Почему я не видел никакого сообщения об ошибке? В оракле была бы какая-нибудь ORA-... (не помню номера конечно)
Как здесь в pgAdmin увидеть что-то подобное. Ведь что-то должна была сообщить база, а не тихо сломаться...
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Выборка работает, а удаление нет. (Операция с датами)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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