Postgresql
PostgreSQL UPDATE 查詢的棘手條件
我需要有關 PostgreSQL 查詢的幫助。
我有一個 Django 應用程序 + pg 後端,使用者可以在其中發布有趣的 URL(或連結),然後可以在這些連結下發表評論(稱為回复)。有兩個 pg 表來表示這一點:links_link和links_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