[英]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
中的conversation
和user
列的組合創建一個UNIQUE
約束:
ALTER TABLE Participants ADD CONSTRAINT unique_conv_user UNIQUE (conversation, user)
然后為Messages
中的conversation
和user
列的組合添加外鍵約束:
ALTER TABLE Messages
ADD CONSTRAINT fk_conv_user
FOREIGN KEY (conversation, user) REFERENCES Participants(conversation, user);
這樣,如果conversation
和user
的組合已經存在於Participants
中,您只能在Messages
中插入新行。
這是一個技巧問題嗎? 您剛剛描述了數據庫中參照完整性的主要用例。 使 Messages.(ID, User) 成為 Participants 表的外鍵。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.