2017-09-17 21 views
0

,所以我試圖跟隨做這樣的查詢(「我不能去工作,要麼...」)這tutorialSQL - 如果存在問題

insted的惰性行,如果不存在更新行

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 

誰能告訴我什麼是布萊恩也許會告訴我我做錯了什麼?

+0

「誰能告訴我什麼是布萊恩,也許告訴我我做錯了什麼」您錯誤地認爲MS-SQL是MySQL服務器。 –

+0

請分享您的表作爲文本數據表或SQL語句(PHPMyAdmin可以導出表爲SQL非常eazy)..並更好地解釋您的要求,而不是關閉不可用的SQL代碼...您使用的列不存在於您的表中.. –

+0

Raymond想要說的是您正在關注Microsoft爲SQL Server提供的教程,但您使用的是MySQL。儘管SQL是一種標準,但每個DB服務器對於標準以外的部分都有不同的實現(有時它們並未完全實現該標準)。在這種情況下,「IF EXISTS()」方法和「@@ ROWCOUNT」方法只能在SQL Server中使用,「ON DUPLICATE KEY」方法只能在MySQL/MariaDB中使用。 –

回答

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); 

這假定您有不希望重複的列上的唯一索引。

+0

好的非常感謝HU,但是我仍然有點困惑,我將如何在當前的表中實現這一點?它不像每一行都有一個獨特的電子郵件字段或相似嗎? 1組合可以有許多不同的硬幣? –

+0

這QUER '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)'是每次查詢 –

+0

我認爲時間插入新行其因爲我需要一個唯一的索引,目前ctc_portfolio_coins_portfolio_fk可以有很多硬幣,所以不可能是唯一的,我想我需要做兩個獨特的密鑰,它們以某種方式相互依賴?像ctc_portfolio_coins_coinfolio_fk是唯一與ctc_portfolio_coins_coin_fk莫名其妙地 –