Sql server 如何将值状态从1更改为0

Sql server 如何将值状态从1更改为0,sql-server,Sql Server,我有一个名为腕带的表,它连接到名为参与者的表 每次在腕带表中插入新行并与腕带表中的现有参与者关联时,我想将腕带表中的属性状态更改为非活动(=0) CREATE TRIGGER tg3_after_insert ON WRISTBANDS AFTER INSERT AS BEGIN UPDATE WRISTBANDS SET STATUS = 0 WHERE IDPARTICIPANT IN (SELECT IDPARTICIPANT FROM WRISTBANDS)

我有一个名为
腕带
的表,它连接到名为
参与者
的表

每次在
腕带
表中插入新行并与
腕带
表中的现有参与者关联时,我想将
腕带
表中的属性
状态
更改为非活动(=0)

CREATE TRIGGER tg3_after_insert
ON WRISTBANDS
AFTER INSERT 
AS
BEGIN 
    UPDATE WRISTBANDS
    SET STATUS = 0
    WHERE IDPARTICIPANT IN (SELECT IDPARTICIPANT FROM WRISTBANDS)
END 
GO
我尝试过这种方法,但结果是表
腕带
中的所有记录将其属性
状态
更改为=0。我希望触发器将插入记录中的
IDPARTICIPANT
与腕带表中的所有记录进行比较,如果存在相同的
IDPARTICIPANT
,则应将存在的记录更改为STATUS=0

希望我已经解释清楚了。我是SQL开发新手,只是在学习


多谢各位

据我所知,当现有记录的
IDPARTICIPANT
值与插入的记录相同时,您希望将其
状态设置为
0
(如果我错了,请纠正我)

为了回答这个问题,我假设您的
腕带
表有一个主键,它是一个名为
ID
的单列(对于复合主键也一样,这是一个简单的假设)

因此,您需要在
腕带
表和
插入的
表(由SQL Server为您生成)之间使用具有内部连接的更新,如下所示(请阅读代码中的注释以获得澄清):


据我所知,当现有记录的
IDPARTICIPANT
值与插入的记录相同时,您希望将其
状态设置为
0
(如果我错了,请纠正我)

为了回答这个问题,我假设您的
腕带
表有一个主键,它是一个名为
ID
的单列(对于复合主键也一样,这是一个简单的假设)

因此,您需要在
腕带
表和
插入的
表(由SQL Server为您生成)之间使用具有内部连接的更新,如下所示(请阅读代码中的注释以获得澄清):


为什么不在代码中只使用
内部联接
?那么你的意图是明确的,你不必在评论中解释它。:-)@阿伦伯特朗·图什:-)有时我写得很明确,有时是含蓄的。我知道这是一个坏习惯,我可能每次都应该明确地写出来(或者至少保持一致),但在这种情况下,我认为这可能只是OP没有意识到我可能会有所帮助的其他事情(至少在阅读一些sql代码时知道,
join
内部join
的简写形式。感谢您的帮助,我尝试了它,它很有效!!虽然我没有解释清楚,但我需要插入的腕带中的最后一条记录保持STATUS=1,其他所有记录都需要更改为STATUS=0。没有指向或的列顺便说一句,没有最后一条记录。在关系数据库中,表是不按narure排序的。为什么不在代码中使用
内部联接
?这样你的意图就很清楚了,你就不必在注释中解释了。:-@AaronBertrand touche:-)有时我显式地编写,有时隐式地编写。我知道这是一个坏习惯,我可能每次都应该明确地写出来(或者至少保持一致),但在这种情况下,我认为这可能只是OP没有意识到我可能会有所帮助的其他事情(至少在阅读一些sql代码时知道,
join
内部join
的简写形式。感谢您的帮助,我尝试了它,它很有效!!虽然我没有解释清楚,但我需要插入的腕带中的最后一条记录保持STATUS=1,其他所有记录都需要更改为STATUS=0。没有指向或的列在关系数据库中,表是不按narure排序的。
CREATE TRIGGER tg3_after_insert
ON WRISTBANDS
AFTER INSERT 
AS
BEGIN 

UPDATE T
SET [Status] = 0 -- status is a reserved word in SQL Server, so use square brackets
FROM WRISTBANDS AS T
JOIN INSERTED AS I -- join is equivalent to inner join
    ON T.IDPARTICIPANT = I.IDPARTICIPANT -- only records with the same IDPARTICIPANT 
WHERE T.Id != I.Id -- only records that was not inserted in he statement that fired this trigger

END