簡體   English   中英

插入但僅在滿足另一個表上的條件時

[英]Insert but only if a condition on another table is met

我有 3 個用於消息傳遞系統的表

對話

| id |

參與者

| id | conversation | user |

留言

| id | conversation | user | text |

如果用戶不是參與者表的一部分,我想限制將消息插入對話

我認為我可以通過讓參與者參與消息表來以更好的方式構建它。 但是在插入消息之前,id 必須通過查看用戶參與者 id 來做一個額外的查詢。

我寧願用約束或外鍵來做。 最好的方法是什么?

您可以在INSERT語句中使用EXISTS

INSERT INTO Messages(id, conversation, user, text)
SELECT :id, :conversation, :user, :text
FROM dual
WHERE EXISTS (
  SELECT 1 
  FROM Participants 
  WHERE conversation = :conversation AND user = :user
) 

如果您的 MySql 版本是 8.0+,您可以省略FROM DUAL

:id:conversation:user:text替換為要插入的列值。

如果ID是自動遞增的 integer 更改為:

INSERT INTO Messages(conversation, user, text)
SELECT :conversation, :user, :text
................................

或者,首先為Participants中的conversationuser列的組合創建一個UNIQUE約束:

ALTER TABLE Participants ADD CONSTRAINT unique_conv_user UNIQUE (conversation, user)

然后為Messages中的conversationuser列的組合添加外鍵約束:

ALTER TABLE Messages 
ADD CONSTRAINT fk_conv_user 
FOREIGN KEY (conversation, user) REFERENCES Participants(conversation, user);

這樣,如果conversationuser的組合已經存在於Participants中,您只能在Messages中插入新行。

這是一個技巧問題嗎? 您剛剛描述了數據庫中參照完整性的主要用例。 使 Messages.(ID, User) 成為 Participants 表的外鍵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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