gpt4 book ai didi

MYSQL 如何仅当另一个表中不存在两列的唯一键对时才更新表?

转载 作者:行者123 更新时间:2023-11-29 14:32:27 25 4
gpt4 key购买 nike

我正在设置一个投票程序,我想限制用户只能投一票。我有两个表:(a)主题表和(b)投票表。

**Subject_Table**              

SID Subject Total_Votes
1 Cows 5
2 Chickens 3


**Vote_Table**

VID Subject User Voteup
1 Cows John 1

总票数等于所有用户的票数。如果某个主题被投票,Voteup 只能等于 1。我已经使用以下语句与主题和用户建立了一个唯一的值对,没有任何问题:

ALTER TABLE Vote_Table ADD UNIQUE limitvote(Subject,User);

当第一次对某个主题进行投票时,将执行以下查询:

$sql="INSERT INTO Vote_Table (Subject, User,Voteup) VALUES ('$Subject', '$User', '$Voteup') ON DUPLICATE KEY UPDATE up=1";
$q = "UPDATE Subject_Table SET Total_Votes = $votes_up= //current votes plus 1;

即使 John 投票两次,由于 ON DUPLICATE KEY UPDATE up=1,Vote_Table 中的投票也将始终等于 1。但在Subject_Table 中却并非如此。没有限制,约翰可以无限投票。约束必须是主体-用户对。约束不能只是主题或用户,因为约翰可以投票给其他主题,其他用户也可以投票给奶牛。

在更新Subject_Table之前,如何检查Vote_Table以查看唯一的Subject-用户对(Cows和John)是否存在?

最佳答案

您可以将其合并到 WHERE 子句中:

UPDATE Subject_Table
SET Total_Votes = Total_Votes + 1
WHERE Subject = ...
AND NOT EXISTS
( SELECT 1
FROM Vote_Table
WHERE Subject = ...
AND User = ...
)
;

也就是说,我不确定您是否真的需要 Subject_Table;您可以在 Vote_Table 上创建一个 View ,该 View 将为您提供相同的信息,而无需创建单独的表。 (请参阅 the Wikipedia article on Database normalization 。)可能如下所示:

CREATE VIEW Subject_View AS
SELECT Subject,
COUNT(1) AS Total_Votes
FROM Vote_Table
GROUP
BY Subject
;

关于MYSQL 如何仅当另一个表中不存在两列的唯一键对时才更新表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9746582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com