У меня проблема в том, что удаленные данные все еще появляются позже в том же запросе.Естественно, в совершенно отдельном запросе удаленные данные не отображаются.
Это не мой вариант использования, но я думаю, что это самый простой способ показать проблему:
CREATE TABLE company (id INT PRIMARY KEY, name TEXT);
CREATE TABLE employee (id INT PRIMARY KEY, company_id INT REFERENCES company(id), name TEXT);
INSERT INTO company VALUES (1, 'first company');
INSERT INTO company VALUES (2, 'second company');
INSERT INTO employee VALUES (1, 1, 'first employee');
INSERT INTO employee VALUES (2, 2, 'second employee');
-- this select can successfully query for the data which has just been deleted
WITH deleted_employee AS (DELETE FROM employee WHERE id = 1 RETURNING id)
SELECT id, name FROM employee JOIN deleted_employee USING (id);
-- this select shows it has been deleted
SELECT * FROM employee;
Я положил его в скрипку здесь .
Кажется, что DELETE
просто не фиксируется, пока не завершится весь запрос, что кажется странным, так как приоритет требует, чтобыDELETE
происходит до SELECT
.
Есть ли способ достичь этого за один запрос?
Редактировать
Ответы ответили на прямую проблему.Основная проблема состоит в том, чтобы удалить сотрудника, а затем удалить связанную с ним компанию, если с этой компанией больше нет сотрудников.
Вот запрос, который я, хотя, и выполнил бы:
WITH affected_company AS (DELETE FROM employee WHERE id = 1 RETURNING company_id)
DELETE FROM company
USING affected_company
WHERE NOT EXISTS (
SELECT 1
FROM employee
WHERE company_id = affected_company.company_id
);
SELECT * FROM company;
SELECT * FROM employee;
И обновленная скрипка .
Вы видите, что компания не удаляется.