2017-02-18 37 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

希望这可以帮助别人的未来。快乐编码