2011-11-12 21 views
1

我作出了每天計數器的博客,我有問題,這個查詢:MySQL查詢幫助:如果存在更新

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服務器版本正確的語法使用

附近手冊 'IF EXISTS SELECT * FROM表A WHERE blog_id = 1個更新來自 表A SET C = C +'」在1號線

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 

回答

3

我懷疑你lokoing爲insert into on duplicate key update語法

從手冊:

12.2.5.3。 INSERT ...對重複密鑰更新語法

如果指定了對重複密鑰更新,和行插入,將導致一個唯一索引或PRIMARY KEY,老 行的更新 重複值進行。

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 
+0

謝謝但你的查詢顯示同樣的錯誤,因爲我的:#1064 - 你的SQL語法有錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在'VALUES(1,1,now())'附近使用正確的語法。'重複密鑰更新'c' ='c' + 1,'c_date' = NOW()'在第1行 – user82324

+0

我修復了這個錯誤,但我遇到了新問題。它插入多個記錄,而不是更新它... – user82324

+0

你有一個唯一的索引在桌子上?你必須在行上有一個唯一的字段,可以是'UNIQUE'索引或'PRIMARY KEY'。當你嘗試插入一些它將更新的獨特的東西時,它會插入。 –

1

在我看來,你真正想要的是this(注意,它只適用於MySQL)!

+0

謝謝,但我怎麼能用在那裏?我已經編輯過這個問題,你可以看到一個我準備好的樣本表。 – user82324

+0

本Swinburne的答案是好的,但你必須把一個唯一的索引在blog_id(所以我認爲你的示例是錯誤的,因爲你有1001兩次) – MatTheCat

+0

blog_id 1001有不同的counter_date ... counter_date將用於獲取報告... – user82324