簡體   English   中英

Postgres- 級聯到關系表的硬刪除

[英]Postgres- hard delete with cascade to relation table

我正在編寫 sql 查詢(使用postgres 14 )以從tags表中DELETE行:

標簽表:

ID team_id 姓名
1 91 開發團隊

但是,它也應該CASCADEteam_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM