Каскадное удаление записей - это функциональность, предоставляемая PostgreSQL, которая позволяет автоматически удалять связанные записи при удалении родительской записи. Эта функция очень полезна для поддержания целостности данных и упрощает процесс удаления связанных данных.
Когда строка удаляется из родительской таблицы, PostgreSQL проверяет наличие связанных строк в дочерней таблице. Если такие строки найдены, они будут удалены автоматически.
Важно быть осторожным при использовании ON DELETE CASCADE
, так как это может привести к к удалению большого количества связанных строк из дочерней таблицы, что может быть нежелательным. Перед использованием ON DELETE CASCADE
необходимо тщательно продумать и протестировать его воздействие на данные в базе данных.
Подробнее про ON DELETE CASCADE:
В ozma.io для колонок с типом reference
можно указать опцию ON DELETE CASCADE
. Это означает, что при удалении "связанной" записи, на которую есть ссылка, будет удалена и текущая запись.
Рассмотрим использование ON DELETE CASCADE
на примере колонки таблицы public.column_fields
:
Name | Type | Is nullable |
---|---|---|
entity_id |
reference(public.entities) on delete cascade |
false |
name |
string |
false |
type |
string |
false |
default |
string |
true |
is_immutable |
bool |
false |
is_nullable |
bool |
false |
В данном примере колонка entity_id
является ссылкой на сущность (public.entities
). Она задана с опцией on delete cascade
, что означает, что при удалении сущности, на которую ссылается entity_id
, будут каскадно удалены все связанные с ней колонки.
Использование ON DELETE CASCADE
добавляет ограничения на создание и использование ON DELETE
триггеров.
Чтобы обойти это ограничение, в FunAPI
существует вызов функции FunDB.recursiveDeleteEntity
, который позволяет удалить запись и все ссылки на нее. Его можно использовать в DELETE триггере, отказавшись от использования опции ON DELETE CASCADE
.
Более подробную информацию о сигнатуре этой и других функций FunAPI
можно найти по ссылке ниже:
// action: "user"."delete_recursive"
export default async function deleteRecursive(args) {
const entity = args.entity;
const id = args.id;
const info = await FunDB.getRelatedEntities(entity, id);
FunDB.writeEvent(JSON.stringify(info, null, 3));
await FunDB.recursiveDeleteEntity(entity, id);
return { ok: true }
}
В данном примере функция deleteRecursive
удаляет запись и все ссылки на нее. Она вызывает функцию FunDB.getRelatedEntities
, которая возвращает объект со ссылками на указанную запись, а затем вызывает функцию FunDB.recursiveDeleteEntity
, которая удаляет все ссылки и саму запись.
Кнопка на форме:
{ $id reference(base.people) }:
SELECT
@type = 'form',
@buttons = [{
caption: 'Delete Record', display: 'desktop',
action: { schema: 'user', name: 'delete_recursive' },
args: {
entity: { schema: 'base', name: 'people' },
id: $id
}
}]
...