繁体   English   中英

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

[英]MYSQL How do I update a table only if a unique key pair of two columns does not exist in another table?

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

**Subject_Table**              

SID   Subject   Total_Votes          
1     Cows      5     
2     Chickens  3     


**Vote_Table**

VID   Subject   User    Voteup           
1     Cows      John    1     

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

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-User对(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上创建一个视图,该视图将为您提供相同的信息,而无需创建单独的表。 (请参阅有关数据库规范化的Wikipedia文章 。)如下所示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM