Почему ON DELETE SET NULL
терпит неудачу при удалении строки с помощью кода приложения, но работает правильно при ручном выполнении оператора SQL?
У меня есть таблица задач и таблица категорий,Таблица задач имеет внешний ключ category_id
, который ссылается на id
в таблице категорий, и она была создана с помощью действия «ON DELETE SET NULL».
create table `category` (
`id` integer not null primary key autoincrement,
`name` varchar(255) not null
);
create table `todo` (
`id` integer not null primary key autoincrement,
`title` varchar(255) not null,
`complete` boolean not null default '0',
`category_id` integer,
foreign key(`category_id`) references `category`(`id`) on delete SET NULL on update CASCADE
);
У меня также естьконечная точка в моем приложении, которая позволяет пользователям удалять категории.
categoryRouter.delete('/:id', async (req, res) => {
const { id } = req.params
await req.context.models.Category.delete(id)
return res.status(204).json()
})
Этот маршрут успешно удаляет категории, но проблема в том, что связанные элементы todo не получают свойству category_id
значение null, поэтому они заканчиваютсяс идентификатором категории, которая больше не существует. Как ни странно, если я открою графический интерфейс своей базы данных и вручную выполню запрос для удаления категории ... DELETE FROM category WHERE id=1
... ловушка "ON DELETE SET NULL" будет успешно запущена. Любой элемент todo с category_id=1
теперь имеет значение null.
Полный источник приложения можно найти здесь .