[英]Postgres- delete record not existing in array as value referenced in another table
[英]Postgres- hard delete with cascade to relation table
我正在編寫 sql 查詢(使用postgres 14 )以從tags
表中DELETE
行:
標簽表:
ID | team_id | 姓名 |
---|---|---|
1 | 91 | 開發團隊 |
但是,它也應該CASCADE
到team_member_tag表:
ID | team_member_id | tag_id |
---|---|---|
1 | 289 | 1 |
由team_member表加入:
ID | team_id | 會員ID |
---|---|---|
289 | 91 | 1 |
我對其進行了測試,但似乎我的INNER JOIN
出現故障。 我不知道我做錯了什么?
我的查詢:
DELETE tag t, team_member_tag tmt
FROM tag
LEFT JOIN team_member_tag tmt ON t.id = tmt.team_member_id
LEFT JOIN team_member tm ON tm.id = tmt.team_member_id
WHERE team_member.member_id = :teamId
AND team_member.member_id = :teamMemberId
$stmt->bindValue("teamId", 91 PDO::PARAM_INT);
$stmt->bindValue("teamMemberId", 289, PDO::PARAM_INT);
我首先嘗試使用SELECT
,它說查詢沒問題,但什么也沒返回:
SELECT
name
FROM tag as t
LEFT JOIN team_member_tag tmt ON t.id = tmt.team_member_id
LEFT JOIN team_member tm ON tm.id = tmt.team_member_id
WHERE name = 'Dev Team'
AND tmt.team_member_id = 289 AND tm.team_id = 91;
對於 postgres,您需要一個 CTE 來執行此操作,如果您沒有級聯引用,請參閱
SELECT t.*, tmt.*
FROM tag t
INNER JOIN team_member_tag tmt ON t.id = tmt.tag_id
INNER JOIN team_member ON tmt.team_member_id = team_member.id
INNER JOIN member ON team_member.member_id = member.id
WHERE team_member.team_id = 91
AND team_member.member_id = 1;
ID | team_id | 姓名 | ID | team_member_id | tag_id |
---|---|---|---|---|---|
1 | 91 | 開發團隊 | 1 | 289 | 1 |
SELECT 1
WITH Bdeletes AS (
DELETE FROM team_member_tag tmt
WHERE tmt.team_member_id IN (SELECT team_member.id
FROM team_member
WHERE team_member.team_id = 91
AND team_member.member_id = 1)
returning tmt.tag_id
)
DELETE from tag t
where t.id
IN( SELECT Tag_id FROM Bdeletes)
DELETE 1
SELECT * FROM tag
ID | team_id | 姓名 |
---|
SELECT 0
SELECT * FROM team_member_tag
ID | team_member_id | tag_id |
---|
SELECT 0
但是,如果您添加一個 REFERENCE,您可以一次完成,添加更多引用也會從其他表中刪除更多行
CREATE TABLE Tag
("id" int primary key, "team_id" int, "name" varchar(8))
;
INSERT INTO Tag
("id", "team_id", "name")
VALUES
(1, 91, 'Dev Team')
CREATE TABLE
INSERT 0 1
CREATE TABLE team_member_tag
("id" int, "team_member_id" int, "tag_id" int references Tag (id) on delete cascade )
;
INSERT INTO team_member_tag
("id", "team_member_id", "tag_id")
VALUES
(1, 289, 1)
;
CREATE TABLE
INSERT 0 1
CREATE TABLE team_member
("id" int, "team_id" int, "member_id" int)
;
INSERT INTO team_member
("id", "team_id", "member_id")
VALUES
(289, 91, 1)
;
CREATE TABLE
INSERT 0 1
CREATE TABLe member("id" int)
CREATE TABLE
INSERT INTO member VALUES(1)
INSERT 0 1
SELECT t.*, tmt.*
FROM tag t
INNER JOIN team_member_tag tmt ON t.id = tmt.tag_id
INNER JOIN team_member ON tmt.team_member_id = team_member.id
INNER JOIN member ON team_member.member_id = member.id
WHERE team_member.team_id = 91
AND team_member.member_id = 1;
ID | team_id | 姓名 | ID | team_member_id | tag_id |
---|---|---|---|---|---|
1 | 91 | 開發團隊 | 1 | 289 | 1 |
SELECT 1
DELETE FROM tag
WHERE id IN
(SELECT tag_id FROM team_member_tag tmt
INNER JOIN team_member ON tmt.team_member_id = team_member.id
WHERE team_member.team_id = 91
AND team_member.member_id = 1)
DELETE 1
SELECT * FROM tag
ID | team_id | 姓名 |
---|
SELECT 0
SELECT * FROM team_member_tag
ID | team_member_id | tag_id |
---|
SELECT 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.