2014-10-20 102 views
0

我遇到了我的sql查詢問題。如果存在或不存在,我需要插入一個需要首先檢查的數據。如果數據存在,則sql查詢必須返回它,否則插入並返回它。我已經谷歌它,但結果是不太適合我的問題。我已經讀過這個。SQL檢查是否存在行,如果沒有插入並返回它

Check if a row exists, otherwise insert How to 'insert if not exists' in MySQL?

這裏是一個查詢,」我在想。

INSERT INTO @tablename(@field, @conditional_field, @field, @conditional_field) 
VALUES(
"value of field" 
(SQL QUERY THAT CHECK IF THERE IS AN EXISTING DATA, IF NOT INSERT THE DATA and RETURN IT, IF YES return it), 
"value of feild", 
(SQL QUERY THAT CHECK IF THERE IS AN EXISTING DATA, IF NOT INSERT THE DATA and RETURN IT, IF YES return it) 
); 

請注意,條件字段是必填字段,因此它不能爲NULL。

+0

定義「迴歸它」的意思 – 2014-10-20 11:25:18

回答

0

您可以將它分成2步 1.運行select語句以檢索與您的值相匹配的行。 select count(*)會給你行數 2.如果找到零行,則運行insert來添加新值。

或者,您可以爲所有列創建唯一索引。如果您嘗試插入所有值存在的行,則會返回錯誤。然後,您可以運行select語句來獲取此現有行的ID。否則,插入將工作。

+0

出於某種原因,我無法將其分成2步。 – 2014-10-20 06:18:11

+0

使用單個SQL命令執行此類操作非常困難。我建議你需要用Python或Perl或PHP等語言在簡單的腳本中包裝你的SQL。他們有很好的庫來連接到MySQL。然後,您可以執行一條語句,檢查結果並根據第一條語句的結果執行第二條語句。 – 2014-10-20 06:33:36

+0

下面的存儲過程看起來像是一個很好的解決方案。 但我還是不太明白你想達到什麼目的。如果你想停止重複值進入一個表,一個獨特的索引是最好的辦法。它會在插入時發出警告。您已經擁有了所有要插入的值,因此不需要由SQL語句返回它們。 – 2014-10-20 22:45:32

0

您可以使用if exists(select count(*) from @tablename)來查看是否有數據,但插入到您需要插入所有列的數據時,如果只有@field缺失,您不能插入插入值,您需要更新表格並採用一些不同的方法。我不知道,爲什麼你檢查每一行?你知道每一行缺少什麼?你是否與其他桌子比較?

0

您可以使用MySQL存儲過程

示例MySQL存儲過程實現它

CREATE TABLE MyTable 
    (`ID` int, `ConditionField` varchar(10)) 
; 

INSERT INTO MyTable 
    (`ID`, `ConditionField`) 
VALUES 
    (1, 'Condition1'), 
    (1, 'Condition2') 
; 


CREATE PROCEDURE simpleproc (IN identifier INT,ConditionData varchar(10)) 
BEGIN 


IF (SELECT ID FROM MyTable WHERE `ConditionField`=ConditionData) THEN 
BEGIN 
    SELECT * FROM MyTable WHERE `ConditionField`=ConditionData; 
END; 
ELSE 
BEGIN 
    INSERT INTO MyTable VALUES (identifier,ConditionData); 
    SELECT * FROM MyTable WHERE `ConditionField`=ConditionData; 
END; 
END IF; 

END// 

調用存儲過程

CALL simpleproc(3,'Condition3'); 

DEMO

1

你的標籤組很奇怪,我不確定你需要列出所有的技術,但只要Firebird關注,就有UPDATE OR INSERTlink)的構造。 代碼也能像

UPDATE OR INSERT INTO aTable 
    VALUES (...) 
    MATCHING (ID, SomeColumn) 
    RETURNING ID, SomeColumn 

注意,這隻適用於PK賽,沒有可用複雜的邏輯工作。如果這不是一種選擇,您可以使用EXECUTE BLOCK,它具有存儲過程的所有功能,但是可以像平常一樣執行查詢。如果兩個客戶端一次執行更新,則會遇到併發更新錯誤。

相關問題