使用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可能會有多行合法數據。
根據事件數據的類型,如果事件數據沒有被插入是因爲它是重複數據,也沒有寫入子數據,所以事件表下面有四個級別可能更深(因爲它會被複制以及)。
您可以使用AFTER INSERT觸發器,並將忽略忽略。如果你有一個重複的鍵入口,插入將失敗,觸發器將不會被執行。 – Gervs 2014-09-18 21:17:17