2010-02-16 116 views
6

我有一個MySQL表'阿爾法',將在一列中包含另一個表「測試版」的主鍵。但是如果無法找到'beta'中的條目,我想在'beta'中插入值,並在'alfa'中使用新的鍵。我能以某種方式在一個查詢中做到這一點嗎?插入,如果不存在其他只是在mysql中選擇

我目前有:

INSERT INTO alfa SET c1=(SELECT id FROM beta WHERE name = 'john'); 

當「約翰」在表中存在的正常工作,但在其他方面失敗。那麼我是否可以改進它,讓新名稱被插入並選擇,如果它不在那裏? id是auto_incremented。

我試着去看IF,但還沒有找到如何使用IF以外的SELECT,這是可能的嗎?

我知道我可以在幾個查詢中做到這一點,但我正在與遠程數據庫交談,所以一次可以完成所有工作。

例如可能已創建這樣的表:

CREATE TABLE alfa (
    c1 int, 
    PRIMARY KEY (c1) 
) 

CREATE TABLE beta (
    id int auto_increment, 
    name varchar(255), 
    PRIMARY KEY (id) 
) 

所以alfa.c1應參照beta.id值。

總之我想做的事:

從公測表中插入約翰將ID爲C1在阿爾法,如果約翰不處於測試階段,存在再插入約翰進入測試階段,插入新的自動遞增的ID爲約翰進入阿爾法的c1。

+0

你可以編輯你的問題,並至少把表結構?目前還不清楚你從哪裏獲得測試版所需的附加信息?如果還沒有在測試版中創建,alfa可能有多少鑰匙? – 2010-02-16 19:14:37

+0

我試圖現在添加更多信息。 – Zitrax 2010-02-16 19:49:33

回答

3

我會走的,但要記住,來自微軟的SQL背景,我不熟悉你的表的確切結構,所以一些SQL可能有點狼狽。

IF (SELECT COUNT(*) FROM beta WHERE name = 'John' > 0) 
    UPDATE alfa SET c1=(SELECT id FROM beta WHERE name = 'John') 
ELSE 
BEGIN 
    INSERT INTO beta (name) VALUES ('John') 
    INSERT INTO alfa (c1) VALUES (LAST_INSERT_ID()) 
END 

希望這有些幫助。

+1

p.s.如果您擔心查詢的數量,爲什麼不使用存儲過程,這樣您仍然只能對遠程服務器進行單一調用。 – Bryan 2010-02-16 20:07:28

+0

謝謝,這似乎很接近。但語法是IF .. ELSE .. END IF。而且似乎IF語句只能用在程序中,所以我必須在任何情況下使用它。這裏討論同樣的問題:http://is.gd/8xupF – Zitrax 2010-02-16 23:33:37