[英]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.