2012-10-30 112 views
1

我試圖執行以下查詢SQL INSERT INTO值,其中不存在

INSERT INTO test (trans_id, voucher_id, trans_date, ledger_code_1, 
        company_code,trans_type, trans_amount) 
VALUES (1, 1,'2012/04/01','2001', '8523a95b-5425-46be-89ed-ebd592846845', 
     'Payment', -30) 
WHERE NOT EXISTS(SELECT trans_id, ledger_code_1 
       FROM test 
       WHERE trans_id = 1 AND ledger_code_1 = '2001') 

它給錯誤。我在哪裏錯了?

1064 - 您的SQL語法錯誤;檢查 對應於你的MySQL服務器版本正確的語法使用 附近,其中不存在手動(從測試選擇TRANS_ID,ledger_code_1其中「在行 ** TRANS_ID = 1和1

是?有沒有其他的解決方案,我有主鍵自動編號..

+3

*它給錯誤* ...有什麼錯誤? –

+1

#1064 - 您的SQL語法錯誤; (選擇trans_id,ledger_code_1來自測試,其中trans_id = 1,''在第1行 –

+6

,因爲INSERT語句不能有WHERE子句,除非你的MySQL服務器版本對應的手冊符合正確的語法它是一個'INSERT INTO ... SELECT'語句 –

回答

3

你可能會考慮一種不同的方法。

從代碼中可以看出,您試圖避免存在兩個具有相同trans_id和ledger_code_1值的語句。如果這是您的問題的正確陳述,則應該使用UNIQUE索引保護這兩列(或者考慮將它們作爲表的主鍵,如果合適的話)。

如果這樣做,您可以發出INSERT語句,而無需擔心避免重複插入的邏輯。如果記錄已經存在,您將不得不陷入異常。

這種方法的優點是,您的保證永遠不會違反這兩列的數據完整性,即使您今後編寫額外的SQL並忘記包含條件或修改數據在表中直接。

除了捕捉異常外,其缺點是它只有在你100%的時候纔會有效,永遠不會允許這些重複的記錄。如果偶爾出現一個實例(例如,對於trans_id 1,而不是trans_id 999),那麼您一直堅持在應用程序代碼中應用完整性檢查。

5

INSERT ... SELECT Syntax

INSERT INTO test   
(trans_id,voucher_id,trans_date,ledger_code_1,company_code,trans_type, Trans_amount) 
SELECT 1, 1,'2012/04/01','2001', '8523a95b-5425-46be-89ed-ebd592846845', 'Payment', -30 
from test 
where not exists(
    select 1 
    from test 
    where trans_id = 1    
     and ledger_code_1 = '2001' 
) 
+1

您需要在外部語句中使用'from'子句 –

+0

@JanDvorak這是不正確的,沒有表格列被選中,請參閱[示例](http://sqlfiddle.com/ #!2/d41d8/3222)。 – RedFilter

+0

對於'select',你不需要'from',但是你需要'from'來選擇'select ... where'。參見這裏:http://sqlfiddle.com /#!2/d41d8/3224 –

0
INSERT INTO test   
    (trans_id,voucher_id,trans_date,ledger_code_1,company_code,trans_type, Trans_amount) 
    SELECT 1, 1,'2012/04/01','2001', '8523a95b-5425-46be-89ed-ebd592846845', 
    'Payment', -30 
    where not exists(
    select trans_id=1,ledger_code_1='2001'  
    ) 
+0

仍然無法正常工作! –

+0

trans_id,ledger_code_1的值在插入時是相同的,並且不存在,因此只有 – SRIRAM

+0

您需要在外部語句中使用'from'子句 - 請參閱其他答案。 –