2017-02-18 44 views
0

早上好,SQL觸發器以避免重複使用多個ID

我找到了解決我的問題,但我想我反正分享它,因爲它可能是爲將來的項目/問題非常有用。我有一個簡單的SQL表,下面是我的更大的股票價格市場數據表的外鍵。

CREATE TABLE [StockMarket] 
(
[ID] INT NOT NULL IDENTITY(1,1) PRIMARY KEY, 
[ReutersRIC] VARCHAR(50), 
[BloombergTicker] VARCHAR(50), 
[YahooSymbol] VARCHAR(50) 
/* other irrelevant columns here*/ 
) 

考慮到這一點,我想健壯性添加到結構,我會從不同的數據源進行添加。對於金融市場上的每個基本時間序列,取決於您使用的數據提供者有多個名稱。我想避免使用不同數據源代表同一時間序列的多條線。我需要一個觸發器:

1)如果插入的值還沒有在表中,它只是插入。 2)如果我插入一行至少有一個[ReutersRIC],[BloombergTicker],[YahooSymbol],[ISIN]已經存在,我更新該特定行。

2.1)的更新應該只發生在非空主菜

我的問題是如何能夠在儘可能最好的方式實現?這花了我一些時間,但我想分享下面的答案以供將來參考。

回答

0

這裏是我的解決方案:

CREATE TRIGGER UniqueStockMarketInserts ON [dbo].[StockMarket] 
INSTEAD OF INSERT 
AS 
BEGIN 
    DECLARE @StockId int 
    SELECT @StockId = S.ID 
     FROM [StockMarket] S INNER JOIN [INSERTED] I 
     ON 
     S.YahooSymbol = I.YahooSymbol OR 
     S.ReutersRIC = I.ReutersRIC OR 
     S.BloombergTicker = I.BloombergTicker OR 
     S.ISIN = I.ISIN 
    IF @StockId IS NULL 
    BEGIN 
     INSERT INTO [StockMarket] (YahooSymbol,ReutersRIC,BloombergTicker,ISIN) 
     SELECT I.YahooSymbol, I.ReutersRIC, I.BloombergTicker, I.ISIN 
     FROM [INSERTED] I 
    END 
    ELSE 
    BEGIN 
    UPDATE S SET 
     S.ISIN = ISNULL(S.ISIN,I.ISIN), 
     S.YahooSymbol = ISNULL(S.YahooSymbol,I.YahooSymbol), 
     S.ReutersRIC = ISNULL(S.ReutersRIC,I.ReutersRIC), 
     S.BloombergTicker = ISNULL(S.BloombergTicker,I.BloombergTicker) 
     FROM INSERTED I, StockMarket S 
     WHERE S.ID = @StockId 
    END 
END 
GO 

下面是我在上面跑了現實生活中的例子測試(除了ISIN我做了):

/*-----------TESTING THE TRIGGER--------*/ 
INSERT INTO StockMarket (ReutersRIC, BloombergTicker) VALUES ('G.TO', 'GG US Equity'); 
INSERT INTO StockMarket (YahooSymbol, BloombergTicker, ISIN) VALUES ('GOOG', 'GOOG US Equity','US123454321'); 
INSERT INTO StockMarket (YahooSymbol, ISIN) VALUES ('RDSA','NL111112222') 
INSERT INTO StockMarket (YahooSymbol, ReutersRIC) VALUES ('GG', 'G.TO');  /*this should update as per trigger*/ 
INSERT INTO StockMarket (ReutersRIC, ISIN) Values ('GOOG.OQ','US123454321'); /*this should update as per trigger*/ 
INSERT INTO StockMarket (YahooSymbol, ReutersRIC) Values ('RDSA', 'RDSa.L'); /*this should update as per trigger*/ 

而且結果:

enter image description here

希望這可以幫助別人的未來。快樂編碼