2012-03-17 143 views
0

我是MySQL的新手。我有兩個相關的表格,很常見的情況:Klients(KID,姓名,姓氏)和Visits(VID,VKID,dateOfVisit) - VKID是Klient ID。我有一個合適的INSERT查詢的問題,這是我想要做的: 1.檢查是否存在具有特定名稱和姓氏的Klient(讓我們假設沒有人具有相同的姓氏) 2.如果是,得到ID並執行INSERT訪問表 3.如果否,則插入新的Klient,將ID和INSERT訪問到訪問。複雜INSERT查詢

是否可以在一個查詢中執行?

+0

聽起來不像一個查詢。 – Randy 2012-03-17 20:30:34

+0

也許交易? – user1091733 2012-03-17 20:32:08

+0

有一個相關的問題,也許這可能有幫助 http://stackoverflow.com/questions/4940283/conditional-mysql-statement-if-true-update-if-false-insert – gastonfartek 2012-03-17 20:47:37

回答

1

INSERT語句只允許一個單一的目標表中的參考。

因此,除非使用觸發器或存儲過程,否則查找的查詢是不可能的。

但是,這種問題是使用休耕小算法通常解決:

1)插入在表中的記錄[訪問]假定父記錄並在表中存在[Klients]

INSERT INTO Visits (VKID, dateOfVisit) 
SELECT KID, NOW() 
FROM Klients 
WHERE ([email protected]) AND ([email protected]) 

2)查詢後查詢插入的記錄數(1)

3)如果沒有記錄被插入,則添加一個新的記錄表[Klients],然後再次運行(1)。

1

嘗試這樣的事情

IF (SELECT * FROM `sometable` WHERE name = 'somename' AND surname = 'somesurname') IS NULL THEN 
INSERT INTO Table1(name,surname) VALUES ('somename', 'somesurname'); 
ELSE INSERT INTO visits(kid,name,surname) 
    SELECT kid, name, surname FROM Table1 WHERE name = 'somename' AND surname = 'somesurname'; 
END IF; 

沒有需要指定

我沒有測試過二次插入「價值」,但這是你正在嘗試的總體思路完成。

+0

它看起來像它適合我的需要,由我收到1064錯誤[上一頁] [代碼] IF NOT EXISTS(SELECT * FROM'Klients' WHERE'surname' ='史密斯)THEN INSERT INTO'Klients'('name','surname')VALUES( '亞當', '史密斯'); ELSE INSERT INTO'Visits'('VKID') SELECT'KID' FROM'Klients' WHERE'surname' = '史密斯'; END IF; [/代碼] [/預] – user1091733 2012-03-17 22:14:59

+0

對不起,但我無法弄清楚如何在我的註釋格式的代碼,這是一個有點亂 – user1091733 2012-03-17 22:22:13

1

這些應該是事務的兩個查詢:

INSERT INTO Klients (name, surname) 
VALUES ('John', 'Doe') 
ON DUPLICATE KEY UPDATE 
KID = LAST_INSERT_ID(KID); 

INSERT INTO Visits (VKID, dateOfVisits) 
VALUES (LAST_INSERT_ID(), NOW()); 

第一條語句是在更新部分使用並不廣爲人知的UPSERT聲明,但對於LAST_INSERT_ID的目的,功能完全相同intented(),其中明確通過的值被存儲用於獲取之後的值。

UPD:我忘記提及您需要添加一個唯一的約束(姓,名)。