-- Команда вида:
delete from table1 where fieldA=(select fieldA from table2);
/* где table2 содержит 1 запись, приводит к ошибке:
58P01 ОШИБКА: не удалось получить состояние транзакции 1575170
58P01 ПОДРОБНОСТИ: Не удалось открыть файл "pg_subtrans/0018": Нет такого файла или каталога.
*/
-- Лечится изменением синтаксиса на:
delete from table1 t1 where exists(select 1 from table2 t2 where t2.fieldA=t1.fieldA);
-- У кого какие мысли по этому поводу? Т.е. не какой вариант правильнее, а почему ТАКАЯ ошибка?
Можно рабочий пример с
Можно рабочий пример с данными, чтобы попробовать, а также версию PostgreSQL и платформу
/*PostgreSQL 9.1.3 on
/*
PostgreSQL 9.1.3 on x86_64-redhat-linux-gnu, compiled by gcc (GCC) 4.6.2 20111027 (Red Hat 4.6.2-1), 64-bit
обе таблицы - в одной схеме, её я тут не указывал - не принципиально, думаю, но в исходной команде префиксы с именем схемы указаны...
в ds_ddlg 1 запись, в ds_dolg > 34000000...
нужно ли приводить данные?
Ниже приведена структура таблиц: */
CREATE TABLE ds_ddlg
(
y integer NOT NULL,
m integer NOT NULL,
ddlg date NOT NULL
)
WITH (
OIDS=FALSE
);
CREATE TABLE ds_dolg
(
ls character varying(10) NOT NULL,
f_id integer NOT NULL,
v_id integer NOT NULL,
ddlg date NOT NULL,
sdlg numeric(20,2) NOT NULL,
dlg_subj character varying(100) NOT NULL DEFAULT ''::character varying,
CONSTRAINT ds_dolg_pkey PRIMARY KEY (ls , f_id , v_id , ddlg )
)
WITH (
OIDS=FALSE
);
CREATE INDEX idx1_ds_dolg
ON ds_dolg
USING btree
(ddlg );
/* А ниже - команда, вызвавшая ошибку при попытке выполнения в PSQL pgAdmin III */
delete from ds_dolg where ddlg=(select ddlg from ds_ddlg);
commit;
-- перепричесал её под exists(select 1...) и расставил алиасы - всё прошло штатно
/*P.S.: под консольным psql - та же проблема, но на другом полигоне выполнилось в исходном синтаксисе без проблем, но с несколько другими данными... Я даже не знаю, на что грешить. Возможно, системные настройки грешат кривизной (разделяемая память) или покосячило что-то в процессе файлового дампа...*/
> нужно ли приводить
> нужно ли приводить данные?
Да, я хочу у себя проверить, а без даннных это будет скорее всего невозможно.
> А ниже - команда, вызвавшая ошибку при попытке выполнения в PSQL pgAdmin III
А! Вот с этого места и надо было начинать!
Выполните команду в psql будет ли ошибка?
И ещё вопрос: зачем commit? Ибо begin я не вижу.
Проблема требует анализа конфигурации.
Поскольку команда выполняется на одном сервере, но глючит на другом, - буду рыть в сторону конфигурации PG и Linux. Не думаю, что простая имитация на Вашем сервере, в отрыве от среды выполнения, поможет выяснить обстоятельства возникновения ошибки. Спасибо за предложение помощи.
P.S.: commit скопипастил случайно, из Sybase`овского скрипта, который, собственно, и адаптировался под pg