MYSQL查询帮助:如果存在更新

MYSQL查询帮助:如果存在更新,mysql,if-statement,exists,Mysql,If Statement,Exists,我正在为一个博客制作每日计数器,我对此查询有问题: 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语法有错误;检查与

我正在为一个博客制作每日计数器,我对此查询有问题:

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服务器版本对应的手册,以了解要使用的正确语法 在“如果存在”附近,从blog_id=1更新来源的表格A中选择* 表A第1行设置c=c+


在我看来,你真正想要的是当心,它只适用于MySQL

在我看来,你真正想要的是当心,它只适用于MySQL

我怀疑您在寻找插入重复密钥更新语法

从手册中:

12.2.5.3。插入关于重复密钥更新语法

如果指定“在重复密钥更新时”,并插入一行,则会导致 唯一索引或主键中的重复值,旧索引或主键的更新 执行第行

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

INSERT INTO tableA (blog_id,c,c_date) VALUES (1,1,now()) ON DUPLICATE KEY UPDATE `c` = `c`+1, `c_date` = NOW()
您需要具有唯一的密钥或主键才能使其工作

ALTER TABLE  `table` ADD PRIMARY KEY (  `id` )
根据您的表示例,您可以向id列添加主键,或者在c_date、blog_id字段上添加唯一的复合索引

并使用以下命令:

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

我怀疑你在寻找插入重复密钥更新语法

从手册中:

12.2.5.3。插入关于重复密钥更新语法

如果指定“在重复密钥更新时”,并插入一行,则会导致 唯一索引或主键中的重复值,旧索引或主键的更新 执行第行

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

INSERT INTO tableA (blog_id,c,c_date) VALUES (1,1,now()) ON DUPLICATE KEY UPDATE `c` = `c`+1, `c_date` = NOW()
您需要具有唯一的密钥或主键才能使其工作

ALTER TABLE  `table` ADD PRIMARY KEY (  `id` )
根据您的表示例,您可以向id列添加主键,或者在c_date、blog_id字段上添加唯一的复合索引

并使用以下命令:

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服务器版本对应的手册,了解使用第1行“值1,1,现在在重复密钥更新上c=c+1,c_date=now”附近的正确语法。我修复了错误,但有新问题。它插入多条记录而不是更新它…表上有唯一的索引吗?行上必须有唯一字段,可以是唯一索引或主键。当你尝试插入一个它将更新的唯一的重复项时,否则它将插入。不,我没有,但是blog_id和c_date都不是唯一的,如果你看到我添加到问题中的示例表,你可以看到计数器是基于日期的,意味着每个blog_id都有一个用于报告的每日计数器…谢谢,但您的查询显示的错误与我的相同:1064-您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,了解使用第1行“值1,1,现在在重复密钥更新上c=c+1,c_date=now”附近的正确语法。我修复了错误,但有新问题。它插入多条记录而不是更新它…表上有唯一的索引吗?行上必须有唯一字段,可以是唯一索引或主键。当你尝试插入一个它将更新的唯一的重复项时,否则它将插入。不,我没有,但是blog_id和c_date都不是唯一的,如果你看到我添加到问题中的示例表,你可以看到计数器是基于日期的,意思是每个blog_id都有一个用于报告的每日计数器…谢谢,但我如何使用其中的哪一个?我已经编辑了这个问题,你可以看到一个示例表,我将使用它。Ben Swinburne的答案是可以的,但是你必须在blog_id上放置一个唯一的索引,所以我认为你的示例是错误的,因为你有1001个twiceblog_id 1001有不同的计数器日期。。。计数器日期将用于获取报告…对,我没有注意到。你必须在blog_id和c_date上放置一个唯一的索引:它不起作用,正如我对Ben说的,blog_id和c_date都不是唯一的,我试图使这两个字段唯一,但它不起作用,在遵循您的建议后,在第三次查询后显示此错误:1062-重复输入“blog_id”键的“1-2”谢谢,但我如何使用其中的where?我已经编辑了这个问题,你可以看到一个示例表,我将使用它。Ben Swinburne的答案是可以的,但是你必须在blog_id上放置一个唯一的索引,所以我认为你的示例是错误的,因为你有1001个twiceblog_id 1001有不同的计数器日期。。。计数器日期将用于获取报告…对,我没有注意到。你必须在blog_id和c_date上放置一个唯一的索引:它不起作用,正如我对Ben说的,blog_id和c_date都不是唯一的,我试图使这两个字段唯一,但它不起作用,根据你的建议,它在第三次查询后显示此错误:1062-重复输入'blog_id'键的'1-2'