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