SQL - 如果存在问题,如果不存在,则为惰性行更新行

时间:2017-09-17 12:39:05

标签: mysql sql mysqli

所以我想尝试遵循这个tutorial

做了这样的查询(“我无法工作......”)

IF EXISTS (SELECT * FROM Table1 WHERE Column1='SomeValue')
    UPDATE Table1 SET (...) WHERE Column1='SomeValue'
ELSE
    INSERT INTO Table1 VALUES (...)

我想这样做

UPDATE Table1 SET (...) WHERE Column1='SomeValue'
IF @@ROWCOUNT=0
    INSERT INTO Table1 VALUES (...)

这样做的好处应该是避免两次索引搜索。

enter image description here

SQL

UPDATE ctc_portfolio_coins SET (ctc_portfolio_coins_amount = 100) WHERE ctc_portfolio_coins_portfolio_fk = 1
IF @@ROWCOUNT=0
    INSERT INTO ctc_portfolio_coins (ctc_portfolio_coins_portfolio_fk, ctc_portfolio_coins_coin_fk, ctc_portfolio_coins_amount) VALUES (1, 1, 100)

错误

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(ctc_portfolio_coins_amount = 100) WHERE ctc_portfolio_coins_portfolio_fk=1
IF ' at line 1

任何人都可以告诉我什么是布莱恩并且可能告诉我我做错了什么?

1 个答案:

答案 0 :(得分:1)

在MySQL中实现原始查询的正确方法是使用ON DUPLICATE KEY UPDATE和唯一索引:

CREATE UNIQUE INDEX idx_table1_column1 ON table1(column1);

INSERT INTO table1(col1, . . . )
    VALUES ( . . . )
    ON DUPLICATE KEY UPDATE col1 = VALUES(col1), . . .;

你不应该学习IF EXISTS表达方式。由于竞争条件,它很差 - 两个线程同时尝试类似的操作。

对于您的特定查询,@@ROWCOUNT不是MySQL的一部分。您的查询将被表述为:

INSERT INTO ctc_portfolio_coins (ctc_portfolio_coins_portfolio_fk, ctc_portfolio_coins_coin_fk, ctc_portfolio_coins_amount)
    VALUES (1, 1, 100)
    ON DUPLICATE KEY UPDATE ctc_portfolio_coins_amount = VALUES(ctc_portfolio_coins_amount);

这假设您在列上有一个您不想重复的唯一索引。