2014-09-18 59 views
1

使用IF語句詢問here幾乎相同的問題,但他沒有得到可操作的答案,只是建議去here,其中沒有使用IF語句。我試圖用後面的鏈接寫一條IF語句和一條條件語句,但我被卡住了(見下文)。基於LAST_INSERT_ID的條件插入

我希望只有在上一次插入嘗試實際插入一行時纔能有條件地插入一行(ROW_COUNT > 0)。以前的插入可能是重複的數據,所以我故意將其設置爲空,因此沒有後續的子插入可以發生在那個LAST_INSERT_ID。 SQL腳本是由C#腳本創建的,所以很可能LAST_INSERT_ID沒有指向您期望的位置。

這裏的腳本生成的代碼的一個非常小的例子(有〜在最後的數據庫3萬行):

SET @Vendors_Vendor_ID = (SELECT vendor_ID FROM VENDORS WHERE vendorName = 'PCA'); 
INSERT IGNORE INTO PCBID (PCBID, PCBDrawing, AssemblyDrawing, PONumber, Vendors_Vendor_ID) 
VALUES (11001, '10405', '41606', '091557.5', @Vendors_Vendor_ID); 
SET @eventType_ID = (SELECT EVENTTYPE_ID FROM EVENTTYPES WHERE EVENTTYPE = 'Creation'); 
SET @USER = 'CTHOMAS'; 
INSERT IGNORE INTO EVENTS (PCBID, EVENTTYPE_ID, DATETIME, USER) 
VALUES (11001, @eventType_ID, '2009-06-15T13:15:27', @USER); 
SET @EVENT_ID = IF(ROW_COUNT() > 0, LAST_INSERT_ID(), null); 
-- THIS DOES NOT WORK 
SELECT IF(@EVENT_ID != null, 
    INSERT INTO EVENTDETAILS (EVENT_ID, ITEMNAME, ITEMVALUE) 
    VALUES (@EVENT_ID, 'Notes', 'WO#89574'), 
    null); 

-- THIS DOESN'T WORK EITHER 
INSERT INTO EVENTDETAILS (EVENT_ID, ITEMNAME, ITEMVALUE) 
SELECT @EVENT_ID, 'Notes', 'WO#89574' 
WHERE @EVENT_ID != null; 

PCBID表是不是重複數據的問題,而事件表有複合唯一密鑰,其通過使用INSERT IGNORE防止重複數據:

CREATE TABLE IF NOT EXISTS `uniqueTest`.`events` (
`Event_ID` INT(11) NOT NULL AUTO_INCREMENT , 
`PCBID` INT(11) NOT NULL , 
`EventType_ID` INT(11) NOT NULL , 
`DateTime` DATETIME NOT NULL , 
`User` VARCHAR(45) NOT NULL , 
PRIMARY KEY (`Event_ID`) , 
UNIQUE KEY `PDU_Index` (`PCBID`, `DateTime`, `User`), 

問題: 我需要能夠基於上一次插入嘗試的條件插入到事件表中,如果它被忽略(因爲它是重複的數據),請勿插入任何子行。目前沒有辦法使任何EventDetail數據具有唯一性,根據給定的Event_ID可能會有多行合法數據。

根據事件數據的類型,如果事件數據沒有被插入是因爲它是重複數據,也沒有寫入子數據,所以事件表下面有四個級別可能更深(因爲它會被複制以及)。

+0

您可以使用AFTER INSERT觸發器,並將忽略忽略。如果你有一個重複的鍵入口,插入將失敗,觸發器將不會被執行。 – Gervs 2014-09-18 21:17:17

回答

1

你的第二次嘗試幾乎是正確的。你必須用IS NOT NULL檢查NULL值。因此,使用

INSERT INTO EVENTDETAILS (EVENT_ID, ITEMNAME, ITEMVALUE) 
SELECT @EVENT_ID, 'Notes', 'WO#89574' FROM DUAL 
WHERE @EVENT_ID IS NOT NULL; -- instead of != 

INSERT INTO EVENTDETAILS (EVENT_ID, ITEMNAME, ITEMVALUE) 
SELECT t.* FROM (
    SELECT @EVENT_ID, 'Notes', 'WO#89574' 
) t 
WHERE @EVENT_ID IS NOT NULL; -- instead of != 

第一個不能正常工作:

-- THIS DOES NOT WORK 
SELECT IF(@EVENT_ID != null, 
    INSERT INTO EVENTDETAILS (EVENT_ID, ITEMNAME, ITEMVALUE) ... 

因爲IF語法

IF(表達式1,表達式2,表達式3)

如果expr1爲TRUE(expr1 <> 0且expr1 <> NULL),則IF()返回expr2;否則它返回expr3。 IF()根據使用它的上下文返回一個數字或字符串值。

有條件地執行語句只能在stored routines。存儲程序的IF syntax將允許像

IF @EVENT_ID IS NOT NULL THEN 
    INSERT INTO EVENTDETAILS (EVENT_ID, ITEMNAME, ITEMVALUE) ... 
END IF 

你必須區分這些兩個語法版本。

+0

感謝您的幫助,我很感激。我得到一個:「語法錯誤,意外的WHERE,期待END_OF_INPUT或';'」在WHERE子句使用上面的示例。 – delliottg 2014-09-18 21:13:38

+0

@delliottg我的不好,我沒有仔細閱讀。如果你使用'WHERE'子句,你也必須有'FROM'子句。您可以使用從Oracle借用的'FROM DUAL'或使用子查詢。兩者都在我的編輯中指出。 – VMai 2014-09-18 21:20:01

+0

不用擔心。我必須在WHERE子句之前將「a」改爲「t」,這使得它完美地工作,謝謝!你可以用這個編輯你的答案嗎?它不會讓我做出這麼小的改變。 – delliottg 2014-09-18 21:38:39