带有冗余密钥的TSQL参考表

时间:2017-12-19 08:58:35

标签: sql-server tsql stored-procedures

我目前正在研究SQL Server 2016上的存储过程。在我的数据库中,我有一个表结构,需要添加另一个表,该表引用与现有表相同的表。

因此,我有2次与同一张桌子的1:1关系。

出现的问题是,我在同一目标表中两次从两个不同的原始表中引用相同的键。

目标表:

FK_Tables | Text
----------------
  1       | Table One Text Id: 1
  1       | Table Two Text Id: 1 // The error: Same FK_Tables 2 times

表一:

ID | OtherField
---------
 1 | 42 

表二:

ID | CoolField
---------
 1 | 22 

表一和表二当前引用表参考表。

你知道如何解决这个问题,两次使用相同的ID吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

您需要为您引用的每个表添加一列,否则如果ID全部插入到同一字段中,您将无法知道ID的来源。像这样:

/*
CREATE TEST TABLES
*/
DROP TABLE IF EXISTS tbOne;

CREATE TABLE tbOne ( ID     INT     IDENTITY(1,1) NOT NULL      PRIMARY KEY
                   , TXT    VARCHAR(10) 
                   );

DROP TABLE IF EXISTS tbTwo;

CREATE TABLE tbTwo ( ID     INT     IDENTITY(1,1) NOT NULL      PRIMARY KEY
                   , TXT    VARCHAR(10) 
                   );

DROP TABLE IF EXISTS Target;

CREATE TABLE Target ( ID     INT    IDENTITY(1,1) NOT NULL      PRIMARY KEY
                    , FKTB1  INT
                    , FKTB2  INT
                    , TXT   VARCHAR(100) 
                    );



-- 1st FK tbOne
ALTER TABLE Target ADD CONSTRAINT FK_One FOREIGN KEY (FKTB1) REFERENCES tbOne (ID);

--2nd FK tbTwo
ALTER TABLE Target ADD CONSTRAINT FK_Two FOREIGN KEY (FKTB2) REFERENCES tbTwo (ID);



-- Populate test tables
INSERT INTO tbOne (TXT)
SELECT TOP 100 LEFT(text, 10)
FROM SYS.messages

INSERT INTO tbTwo (TXT)
SELECT TOP 100 LEFT(text, 10)
FROM SYS.messages



INSERT INTO [Target] (FKTB1, FKTB2, TXT)
SELECT 1, 1, 'Test - constraint'


-- Check result set
SELECT *
FROM tbTwo

SELECT *
FROM tbOne


SELECT *
FROM [Target] T
    INNER JOIN tbOne TB1
        ON T.FKTB1 = TB1.ID
    INNER JOIN tbTwo TB2
        ON T.FKTB2 = TB2.ID