0

我有 2 个要执行的查询。

delete from song where ast_id = 1;
delete from artist where ast_id = 1;

与 2 有关系。 1 有一个引用另一个的 FK。

我认为查询将一起执行,但我认为如果以正确的顺序执行,将删除艺术家的歌曲,然后是艺术家自己。此情况并非如此。

我最终通过将其分解为 2 个事务来解决它,但是有没有办法让它只保留 1 个?

我正在做一些事情:

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

你可以在上面的 1 笔交易中做到吗/?

4

1 回答 1

2

如前所述,一种方法是启动事务(与命令不同)、添加查询并提交。

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

sqlite3_exec(db, "begin;");
sqlite3_exec(db, "delete from song where ast_id = 1;");
sqlite3_exec(db, "delete from artist where ast_id = 1;");
sqlite3_exec(db, "commit;");

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

您可以检查它们是否启用:

PRAGMA foreign_keys;

或者只是打开它们:

PRAGMA foreign_keys = ON;

对于您的 Song 表,您的参考必须正确形成,您必须说出您想在删除时执行的操作:

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

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

于 2012-12-19T03:06:18.843 回答