【问题标题】:MYSQL Query help : If exists updateMYSQL 查询帮助:如果存在更新
【发布时间】:2011-11-12 15:20:38
【问题描述】:

我正在为博客制作每日计数器,但我对这个查询有疑问:

IF EXISTS SELECT * FROM tableA WHERE blog_id=1
    UPDATE FROM tableA SET c=c+'1' WHERE blog_id='1' AND c_date=NOW()
ELSE
    INSERT INTO FROM tableA VALUES (blog_id,c,c_date) VALUES (1,1,now())

它显示以下错误:

1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以了解正确的语法使用

near 'IF EXISTS SELECT * FROM tableA WHERE blog_id=1 UPDATE FROM 第 1 行的 tableA SET c=c+''

My table entries should look like this :
id , blod_id , c , c_date
1 , 1001, 66 , 2011-11-11 
2 , 1001, 160 , 2011-11-12
3 , 1002, 200 , 2011-11-12
4 , 1003, 33 , 2011-11-12

【问题讨论】:

    标签: mysql if-statement exists


    【解决方案1】:

    我怀疑你正在寻找 insert into on duplicate key update 语法

    来自手册:

    12.2.5.3。 INSERT ... ON DUPLICATE KEY UPDATE 语法

    如果您指定 ON DUPLICATE KEY UPDATE,并且插入的行会导致 UNIQUE 索引或 PRIMARY KEY 中的重复值,旧的 UPDATE 行被执行。

    http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

    您的查询应该更像以下示例:

    INSERT INTO tableA (blog_id,c,c_date) VALUES (1,1,now()) ON DUPLICATE KEY UPDATE `c` = `c`+1, `c_date` = NOW()
    

    您需要拥有UNIQUE 密钥或PRIMARY KEY 才能使用。

    ALTER TABLE  `table` ADD PRIMARY KEY (  `id` )
    

    根据您的表示例,您可以向 id 列添加主键或在 (c_date, blog_id) 字段上添加唯一复合索引

    ALTER TABLE  `table` ADD UNIQUE (
    blog_id ,
    c_date
    );
    

    并使用它:

    INSERT INTO tableA (blog_id, c, c_date) 
      VALUES (1, 1, NOW()) 
    ON DUPLICATE KEY UPDATE 
      c = c + 1                --- update only `c`, not any part of the unique key
    

    【讨论】:

    • 谢谢,但您的查询显示的错误与我的相同:#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法,以便在 'VALUES (1,1,now()) ON DUPLICATE KEY UPDATE c = c+1, c_date = NOW()' 附近使用在第 1 行
    • 我修复了错误,但我遇到了新问题。它插入多条记录而不是更新它...
    • 你的表有唯一索引吗?行上必须有一个唯一字段,无论是UNIQUE 索引还是PRIMARY KEY。当您尝试插入与唯一副本重复的内容时,它将更新,否则将插入。
    • 不,我没有,但 blog_id 和 c_date 都不是唯一的,如果您看到我添加到问题中的示例表,您可以看到计数器是基于日期的,表示每个 blog_id有一个用于报告的每日计数器...
    【解决方案2】:

    在我看来你真正想要的是this(注意,它只适用于 MySQL)!

    【讨论】:

    • 谢谢,但我如何使用 where in there ?我已经编辑了这个问题,你可以看到一个我将要拥有的示例表。
    • Ben Swinburne 的回答没问题,但你必须在 blog_id 上放置一个唯一索引(所以我认为你的样本是错误的,因为你有两次 1001)
    • blog_id 1001 有不同的 counter_date ... counter_date 将用于获取报告 ...
    • 对,我没注意到。您必须在 blog_id 和 c_date 上放置一个唯一索引:stackoverflow.com/questions/635937/…
    • 它不起作用,正如我对 Ben 所说的那样,blog_id 和 c_date 都不是唯一的,我试图使这两个字段唯一但它不起作用,在遵循你的建议后它显示了这个错误第三次查询后:#1062 - 键“blog_id”的重复条目“1-2”
    猜你喜欢
    • 2014-05-05
    • 1970-01-01
    • 2011-11-07
    • 2011-07-19
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    相关资源
    最近更新 更多