在SQLite中删除多个父键和外键的行

问题描述 投票:1回答:1

我是SQLite的初学者。我试图删除TableA中的行,它也应该删除相关的连接表行。

TableA
id
name

TableB
id
tbidA ref key TableA(id)
name
tbidC ref key TableC(id)
tbidD ref key TableD(id)
tbidE ref key TableE(id)

TableD
id
name

TableE
id
name

TableF
id
name

TableG
id
tbidE ref key TableE(id)
name

我尝试了JOINS,但它抛出了语法错误。然后我发现SQLite不支持DELETE JOINS。如何使用ON DELETE CASCADE上面的表结构?

sqlite foreign-keys cascading-deletes
1个回答
0
投票

我相信以下代码将按您的要求/描述: -

DROP TABLE tableg;
DROP TABLE tableb;
DROP TABLE tablea;
DROP TABLE tablec;
DROP TABLE tabled;
DROP TABLE tablee;
CREATE TABLE IF NOT EXISTS tablea (id INTEGER PRIMARY KEY, name TEXT UNIQUE);
CREATE TABLE IF NOT EXISTS tablec (id INTEGER PRIMARY KEY, name TEXT UNIQUE);
CREATE TABLE IF NOT EXISTS tabled (id INTEGER PRIMARY KEY, name TEXT UNIQUE);
CREATE TABLE IF NOT EXISTS tablee (id INTEGER PRIMARY KEY, name TEXT UNIQUE);
CREATE TABLE IF NOT EXISTS tablef (id INTEGER PRIMARY KEY, name TEXT UNIQUE);
CREATE TABLE IF NOT EXISTS tableb (id INTEGER PRIMARY KEY, 
    tbida REFERENCES tablea(id) ON DELETE CASCADE, 
    name,
    tbidc REFERENCES tablec(id) ON DELETE CASCADE,
    tbidd REFERENCES tabled(id) ON DELETE CASCADE,
    tbide REFERENCES tablee(id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS tableg (id INTEGER PRIMARY KEY, 
    name TEXT,
    tbide REFERENCES tablee(id) ON DELETE CASCADE
);
INSERT OR IGNORE INTO tablea (name) VALUES('A-Fred'),('A-Bert'),('A-Mary'),('A-Sue'),('A-Ann'),('A-Jane'),('A-Tom');
INSERT OR IGNORE INTO tablec (name)  VALUES('C-Fred'),('C-Bert'),('C-Mary'),('C-Sue'),('C-Ann'),('C-Jane'),('C-Tom');
INSERT OR IGNORE INTO tabled (name)  VALUES('D-Fred'),('D-Bert'),('D-Mary'),('D-Sue'),('D-Ann'),('D-Jane'),('D-Tom');
INSERT OR IGNORE INTO tablee (name)  VALUES('E-Fred'),('E-Bert'),('E-Mary'),('E-Sue'),('E-Ann'),('E-Jane'),('E-Tom');

INSERT OR IGNORE INTO tableb (name, tbida, tbidc, tbidd, tbide) VALUES
    ('B-X1',1,1,1,1),
    ('B-Y1',1,3,4,5),
    ('B-Z1',6,2,2,2)
;
INSERT OR IGNORE INTO tableg (name, tbide) VALUES('G-X1',5),('G-Y1',3),('G-Z1',4);

SELECT * FROM tablea 
    JOIN tableb ON tablea.id = tbida
    JOIN tablec ON tablec.id = tbidc
    JOIN tabled ON tabled.id - tbidd
    JOIN tablee ON tablee.id = tableb.tbide
    JOIN tableg ON tableg.id = tablee.id
;

DELETE FROM tablea WHERE id = 1; -- <<<<<<<<<<

SELECT * FROM tablea 
    JOIN tableb ON tablea.id = tbida
    JOIN tablec ON tablec.id = tbidc
    JOIN tabled ON tabled.id - tbidd
    JOIN tablee ON tablee.id = tableb.tbide
    JOIN tableg ON tableg.id = tablee.id
;

第一个结果是(即加载相关数据(根据完全连接表)): -

enter image description here

从tableA(即A-Fred)删除第一行后的第二个结果: -

enter image description here

这是ON DELETE CASCADE在执行DELETE FROM tablea WHERE id = 1;时执行分层删除

© www.soinside.com 2019 - 2024. All rights reserved.