SQL触发器可避免重复多个ID

时间:2017-02-18 11:45:49

标签: sql-server-2008 triggers duplicates

早上好,

我找到了我的问题的解决方案,但我认为无论如何我都会分享它,因为它可能对未来的项目/问题有用。我下面有一个简单的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)更新应仅在非空主菜上进行

我的问题是如何以最佳方式实现这一目标?我花了一些时间,但我想分享下面的答案以供将来参考。

1 个答案:

答案 0 :(得分: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

希望这可以在将来帮助某人。快乐的编码