sql - 如何在更新父记录时插入一组子记录?

标签 sql sql-server-2005 sql-update parent

我正在使用 SQL Server 2005,希望创建多个地址记录,并使用新 ID 更新联系人记录:

查看下表

create table contact(id int primary key identity, home_address_id int, work_address_id int)

create table address(id int primary key identity, street varchar(25), number int)

和外键:

ALTER TABLE dbo.contact ADD CONSTRAINT  FK_contact_address1 FOREIGN KEY (home_address_id) REFERENCES dbo.address(id)
ALTER TABLE dbo.contact ADD CONSTRAINT  FK_contact_address2 FOREIGN KEY (work_address_id) REFERENCES dbo.address(id)

一些虚拟数据

insert into contact default values
insert into contact default values
insert into contact default values

如何为所有没有家庭住址的联系人插入默认的空地址记录,并一次性更新 home_address_id?

第一部分很简单:

insert into address(street) select null from contact where home_address_id is null

我什至可以获得新创建的地址 ID:

declare @addressTable table(id int)
insert into address(street) 
OUTPUT INSERTED.Id INTO @addressTable
select null from contact where home_address_id is null

这是新的 ID

select * from @addressTable

但是如何使用这些新 ID 更新联系人表呢?

最佳答案

如果可能,我建议通过添加 Contact_Addresses 表来标准化您的数据库:

CREATE TABLE Contact_Addresses
(
    contact_id INT NOT NULL,
    address_id INT NOT NULL,
    address_type VARCHAR(10) NOT NULL,
    CONSTRAINT PK_Contact_Addresses PRIMARY KEY CLUSTERED (contact_id, address_id, address_type),
    CONSTRAINT FK_ContactAddresses_Contacts (contact_id) REFERENCES Contacts (id),
    CONSTRAINT FK_ContactAddresses_Addresses (address_id) REFERENCES Addresses (id),
    CONSTRAINT CK_ContactAddresses_address_type CHECK address_type IN ('HOME', 'WORK')
)

接下来,我建议不要将“虚拟”记录放入数据库中。它最终会引起头痛。数据库应包含系统中数据的准确记录。如果您想在系统中不存在联系人地址时默认显示某些值,请在您的 UI 中进行处理。

如果你确实必须这样做,那么下面的代码应该可以解决问题:

;WITH C_CTE AS
(
    SELECT
        id,
        home_address_id,
        ROW_NUMBER() OVER(ORDER BY id) AS seq
    FROM
        Contacts
),
(
    SELECT
        id,
        ROW_NUMBER() OVER(ORDER BY id) AS seq
    FROM
        Addresses
)
UPDATE
    C_CTE
SET
    home_address_id = A.id
FROM
    C_CTE C
INNER JOIN A_CTE A ON A.seq = C.seq

关于sql - 如何在更新父记录时插入一组子记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3363146/

相关文章:

c# - SQL查询单独日期

c# - 如何使用 Entity Framework 和asp.net 删除多个数据?

sql-server - 无法安装 Microsoft SQL Server 2008 (R2) Management Studio

MySQL - 如何将重复 ID 的出现次数添加到行中

mysql - 主键在 UPDATE 时物理上重新排序吗?

sql - 如何从表中的日期列中减去 15 天?

php - 将数据库值从 html 表超链接传递到下一页的 SQL 查询

sql - Hive 填充前导零

sql - 如何在 WHERE 子句中引用别名?

SQL最快的 'GROUP BY'脚本