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

时间:2012-03-17 01:55:02

标签: mysql insert

我正在设立一个投票计划,我想限制用户一票。我有两个表:(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。我使用以下语句与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以查看唯一的主题 - 用户对(Cows和John)是否存在?

1 个答案:

答案 0 :(得分:1)

您可以将其合并到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上创建一个视图,该视图将为您提供相同的信息,而无需创建单独的表。 (参见the Wikipedia article on Database normalization。)看起来像这样:

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