以多对多关系更新Junction表

时间:2009-02-22 14:38:49

标签: many-to-many

这是对此问题的跟进问题:

Query examples in a many-to-many relationship

关于更新联结表。为此,我必须在WHERE子句中使用联结表中的两个键值。

Users       UserAddresses     Addresses
=======     =============     =========
FirstName   UserId            City
LastName    AddressId         State
                              Zip

在这个例子中,例如,假设我想更新UserAddresses表中的AddressId字段,因为用户更改了他的地址。我必须在更新WHERE子句中使用现有的UserId和地址AddressId。

我正在使用存储过程,并将UserId和新的AddressId作为参数传递。

我试过这个:

CREATE PROCEDURE dbo.test
(
@UserId int,
@AddressId int
)
AS
create table #temp
    (
    UserId int not null,
    AddressId int not null
    )
    insert into #temp select UserId, AddressId from UserAddresses where UserId = @UserId

update UserAddresses
set AddressId = @AddressIdD
WHERE (UserId+AddressId in #temp table = UserId+AddressId passed in as parameters)??

我尝试过各种各样的组合,但我似乎无法正确理解语法。

UserId传入,将与UserAddresses表中的那个相同,但这只是我尝试了一些事情。 WHERE子句似乎出错了。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

这实际上看起来像是多对一的关系。如果不是,您将需要旧的地址ID以及新的地址ID和用户ID来进行更改。如果它是多对一关系,那么简单的更新应该有效,因为每个用户ID只存在一个用户id /地址id对:

update UserAddresses
set AddressId = @AddressId
where UserId = @UserId

如果真的是多对多关系,你需要从许多可能的关系中找到现有的对并更新那个 - 除了用户之外,你还需要新的和旧的地址id标识。

update UserAddresses
set AddressId = @NewAddressId
where UserId = @UserId and @AddressId = @OldAddressId

答案 1 :(得分:0)

为什么要使用临时表?

CREATE PROCEDURE dbo.test
(
@UserId int,
@AddressId int
)
AS
update UserAddresses
set AddressId = @AddressIdD
WHERE UserId = @UserId

答案 2 :(得分:0)

tvanfossom正确地指出了代码中的问题。

使用上表,您的操作可以通过多种方式完成:

  • 将链接插入新地址并删除指向旧地址的链接,保留或删除链接到的地址记录。
  • 更新链接记录为tvanfossom描述(LuckyLindys查询会将用户的所有注册地址设置为相同的地址)。
  • 更新要链接的地址记录。

您使用哪一个取决于您在应用程序中的需求。我可能只是更新链接的地址,或者你需要保留原来的地址吗?