如何将数据添加到通过外键链接的两个表?

时间:2009-06-25 12:04:39

标签: sql sql-server database sql-server-2005 foreign-keys

如果我要有2个表,请将它们称为TableA和TableB。 TableB包含引用TableA的外键。我现在需要为给定方案向TableA和TableB添加数据。为此,我首先必须在TableA中插入数据,然后查找并检索TableA的最后插入的主键,并将其用作TableB中的外键值。然后我在TableB中插入值。这似乎只是为了插入1组数据而做了大量的工作。我怎么能做到这一点?如果可能,请向我提供SQL Server 2005的SQL语句。

3 个答案:

答案 0 :(得分:4)

这听起来不错。请注意,您可以逐行使用SCOPE_IDENTITY(),或者如果使用INSERT / OUTPUT语法,则可以执行基于集合的操作,然后加入第一个插入的输出集 - 例如,这里我们只有1个INSERT(每个)进入“真实”表:

/*DROP TABLE STAGE_A
DROP TABLE STAGE_B
DROP TABLE B
DROP TABLE A*/
SET NOCOUNT ON

CREATE TABLE STAGE_A (
    CustomerKey varchar(10),
    Name varchar(100))
CREATE TABLE STAGE_B (
    CustomerKey varchar(10),
    OrderNumber varchar(100))

CREATE TABLE A (
    Id int NOT NULL IDENTITY(51,1) PRIMARY KEY,
    CustomerKey varchar(10),
    Name varchar(100))
CREATE TABLE B (
    Id int NOT NULL IDENTITY(1123,1) PRIMARY KEY,
    CustomerId int,
    OrderNumber varchar(100))

ALTER TABLE B ADD FOREIGN KEY (CustomerId) REFERENCES A(Id);

INSERT STAGE_A VALUES ('foo', 'Foo Corp')
INSERT STAGE_A VALUES ('bar', 'Bar Industries')
INSERT STAGE_B VALUES ('foo', '12345')
INSERT STAGE_B VALUES ('foo', '23456')
INSERT STAGE_B VALUES ('bar', '34567')

DECLARE @CustMap TABLE (CustomerKey varchar(10), Id int NOT NULL)

INSERT A (CustomerKey, Name)
OUTPUT INSERTED.CustomerKey,INSERTED.Id INTO @CustMap
SELECT CustomerKey, Name
FROM STAGE_A

INSERT B (CustomerId, OrderNumber)
SELECT map.Id, b.OrderNumber
FROM STAGE_B b
INNER JOIN @CustMap map ON map.CustomerKey = b.CustomerKey

SELECT * FROM A
SELECT * FROM B

答案 1 :(得分:1)

如果您直接使用SQL,那么您就拥有了正确的解决方案。

如果您从代码执行插入操作,您可能有更高级别的结构来帮助您实现此目的(LINQ,Django模型等)。

答案 2 :(得分:1)

如果要在直接SQL中执行此操作,我建议创建一个存储过程,将所有数据作为参数,然后在事务内执行插入/选择标识/插入步骤。即使该过程仍与手动插入相同,使用存储过程也可以让您更轻松地从代码中使用它。正如@Rax所提到的,您也可以使用ORM来获得类似的功能。