Postgresql

PostgreSQL UPDATE 查詢的棘手條件

  • May 1, 2016

我需要有關 PostgreSQL 查詢的幫助。

我有一個 Django 應用程序 + pg 後端,使用者可以在其中發布有趣的 URL(或連結),然後可以在這些連結下發表評論(稱為回复)。有兩個 pg 表來表示這一點:links_linklinks_publicreply

我要從links_publicreply中刪除老化的行。這很容易:

DELETE FROM links_publicreply WHERE "submitted_on" < now() - interval '7 days';

但是其中一些在links_link表中被引用,因此查詢失敗。表中參考links_link為:

latest_reply = models.ForeignKey
   (
       'links.Publicreply', 
       blank=True, 
       null=True, 
       on_delete=models.SET_NULL
   )

我的第一個問題是:如何也刪除這些外鍵引用

我的預感是:

begin;
UPDATE links_link SET latest_reply=NULL where latest_reply_id in 
   (SELECT id FROM links_publicreply where "submitted_on" < now() - interval '7 days');
DELETE FROM links_publicreply WHERE "submitted_on" < now() - interval '7 days';
commit;

這看起來對嗎?

如果您仔細閱讀上面的更新查詢,您會注意到它會將 latest_reply設置為 null,只要它指向舊的links_publicreply行。

我其實不想那樣做。理想情況下,我想將latest_reply設置為下一個可用的links_publicreply記錄(與特定links_link記錄相關聯),該記錄不會被查詢刪除:

DELETE FROM links_publicreply WHERE "submitted_on" < now() - interval '7 days'; 

**我怎麼做?**這是我的第二個問題。


PG 表,如我的 Django 應用程序的models.py中所述,如下所示:

class Link(models.Model):
   description = models.TextField(validators=[MaxLengthValidator(500)])
   submitter = models.ForeignKey(User)
   submitted_on = models.DateTimeField(auto_now_add=True)
   reply_count = models.IntegerField(default=0)
   latest_reply = models.ForeignKey
       ('links.Publicreply', blank=True, null=True, on_delete=models.SET_NULL)

class Publicreply(models.Model):
   submitted_by = models.ForeignKey(User)
   answer_to = models.ForeignKey(Link)
   submitted_on = models.DateTimeField(auto_now_add=True)
   description = models.TextField(validators=[MaxLengthValidator(250)])

只需ON DELETE CASCADE為您的外鍵添加一個選項:

ALTER TABLE links_link 
DROP CONSTRAINT constraint_name,   
ADD CONSTRAINT constraint_name FOREIGN KEY (latest_reply_id)
     REFERENCES links_publicreply(id) ON DELETE CASCADE;

顯然在 django 中,上面的內容被翻譯為:

on_delete=models.CASCADE

引用自:https://dba.stackexchange.com/questions/137100