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

前述のように、1 つのアプローチは、トランザクション (コマンドとは異なります) を開始し、クエリを追加してコミットすることです。

(これは疑似コードであることに注意してください。使用しているプラ​​ットフォームはわかりません)

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 に答える