0

私はいくつかのテーブルを作成しました:

"CREATE TABLE IF NOT EXISTS WORKOUTPLANS (ID INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL  UNIQUE , NAME TEXT NOT NULL  UNIQUE, DESCRIPTION TEXT NOT NULL  UNIQUE)";
"CREATE TABLE IF NOT EXISTS ENTITY (ID INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL  UNIQUE , NAME TEXT NOT NULL  UNIQUE , DESCRIPTION TEXT NOT NULL  UNIQUE)";
"CREATE TABLE IF NOT EXISTS EXERCISE (ID INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL  UNIQUE , NAME TEXT NOT NULL  UNIQUE , DESCRIPTION TEXT NOT NULL  UNIQUE , REPS TEXT NOT NULL , WEIGHT TEXT NOT NULL)";
"CREATE TABLE IF NOT EXISTS WPEN (PLANID, ENID, FOREIGN KEY(PLANID) REFERENCES WORKOUTPLANS(ID) ON DELETE CASCADE, FOREIGN KEY(ENID) REFERENCES ENTITY(ID) ON DELETE CASCADE)";
"CREATE TABLE IF NOT EXISTS ENEX (ENTITYID, EXERCISEID, FOREIGN KEY(ENTITYID) REFERENCES ENTITY(ID) ON DELETE CASCADE, FOREIGN KEY(EXERCISEID) REFERENCES EXERCISE(ID) ON DELETE CASCADE)";

ご覧のとおり、m:n の関係が必要であり、この接続テーブルには、カスケード削除に関する制約があります。データベースに接続するたびに、sqlite で外部キーをアクティブにする必要があることを知っています。

ただし、WORKOUTPLANS で行を削除すると、ENTITY、EXERCISE、および ENEX ではなく、WORKOUTPLANS および WPEN で行が削除されるだけです。

削除時カスケードが機能しないのはなぜですか?

4

1 に答える 1

1

他にはに対するアクションがないため、WORKOUTPLANSおよびから削除するだけです。WPENon delete cascadeWORKOUTPLANS

on delete cascade左が外部キー制約を持つon delete cascadeテーブルで、右がテーブルのスキーマの概要を次に示します。

WPEN -> WORKOUTPLANS
WPEN -> ENTITY
ENEX -> ENTITY
ENEX -> EXERCISE

したがって、 で行を削除するとWORKOUTPLANS、 からも削除されWPENます。から削除すると、 とENTITYからも削除されWPENますENEX。から削除するとEXERCISE、 からも削除されENEXます。

これは、アクションの適切な参照リンクです。on delete

これは、あなたが望むように聞こえるものに対する良いスタックオーバーフローの答えです。

于 2013-01-17T19:56:46.487 に答える