Transactions SQLite将允许您在一个事务中放置多个查询,但是为什么当1与另一个有fK_关系时它会异常呢?

Transactions SQLite将允许您在一个事务中放置多个查询,但是为什么当1与另一个有fK_关系时它会异常呢?,transactions,sqlite,Transactions,Sqlite,我有两个我想执行的查询 delete from song where ast_id = 1; delete from artist where ast_id = 1; 这与2有关系。1具有引用另一个的FK 我认为这些查询将一起执行,但我认为如果按正确的顺序执行,将删除艺术家的歌曲,然后删除艺术家自己的歌曲。事实并非如此 我最终解决了这个问题,只是把它分成了两个事务,但有没有办法让它只剩下一个呢 我在做的事情大致如下: string query("delete from song where a

我有两个我想执行的查询

delete from song where ast_id = 1;
delete from artist where ast_id = 1;
这与2有关系。1具有引用另一个的FK

我认为这些查询将一起执行,但我认为如果按正确的顺序执行,将删除艺术家的歌曲,然后删除艺术家自己的歌曲。事实并非如此

我最终解决了这个问题,只是把它分成了两个事务,但有没有办法让它只剩下一个呢

我在做的事情大致如下:

string query("delete from song where ast_id = 1; delete from artist where ast_id = 1;");
sqlite3_exec(db, query.c_str(),...);

您可以在1个事务中完成它,如上面所述/?

一种方法是启动事务(与命令不同),添加查询,然后提交

(注意这是伪代码,我不确定您使用的是什么平台)

但是使用外键的方法是首先确保启用外键

您可以通过以下方式检查它们是否已启用:

PRAGMA foreign_keys;
或者只需通过以下方式打开它们:

PRAGMA foreign_keys = ON;
对于您的歌曲表,您的引用必须正确形成,您必须说明删除时要执行的操作,因此:

Create Table Song
(
  Song_Id Integer Primary Key,
  ...
  Ast_Id Integer,
  Foreign Key (Ast_Id) References Artist(Ast_Id) ON DELETE CASCADE
);

然后,只需删除艺术家,歌曲就会随之出现。

请注意,向
sqlite3\u exec
发出两个命令不会在一个事务中执行它们;您必须实际执行
BEGIN
/
COMMIT
命令。请显示架构、错误消息,以及您在哪个命令上出错。其他人已经解释了如何使用事务,您似乎在单独的自动提交事务中执行两个连续命令。我不明白的是,除非在错误的表中定义了外键(外键应该在song上,而不是artist上),否则为什么两个单独的语句不起作用。
Create Table Song
(
  Song_Id Integer Primary Key,
  ...
  Ast_Id Integer,
  Foreign Key (Ast_Id) References Artist(Ast_Id) ON DELETE CASCADE
);