sql - 如何向通过外键链接的两个表添加数据?

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

如果我有 2 个表,将它们命名为 TableA 和 TableB。 TableB 包含引用 TableA 的外键。我现在需要为给定的场景向 TableA 和 TableB 添加数据。为此,我首先必须在 TableA 中插入数据,然后查找并检索 TableA 最后插入的主键,并将其用作 TableB 中的外键值。然后我在 TableB 中插入值。这似乎只是为了插入一组数据而做的很多工作。我还能如何实现这一目标?如果可能,请为我提供 SQL Server 2005 的 SQL 语句。

最佳答案

听起来不错。请注意,您可以在每行的基础上使用 SCOPE_IDENTITY(),或者如果您使用 INSERT/OUTPUT 语法,则可以执行基于集合的操作,然后加入第一个输出的集合insert - 例如,这里我们只有 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

关于sql - 如何向通过外键链接的两个表添加数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1043550/

相关文章:

mysql concat 列作为字符串传递

sql - 如何在postgres中将记录集转换为json数组

sql-server - SQL Server 2008 R2 中的 NULL 相等性

MySQL 对来自多个表的项目进行分页

mysql - 两个相同的公式产生不同的结果

mysql - 我一直在寻找解决方案来获取 Mysql 中的多列(单行)总和,以获取每小时的电费发票总计?

sql - 计数、排序并选择前 5 个

sql - 如何根据列过滤器缩小不同行的范围?

c++ - 将数据从客户端发送到 SQL 数据库 (MoSync)

python - django-avatar 的数据库错误