【问题标题】:sql after insertion trigger update column within the same table在同一个表中插入触发器更新列后的sql
【发布时间】:2015-08-18 16:13:49
【问题描述】:

我正在尝试编写一个触发器来在插入完成时更新同一个表中的列

我的桌子是

create table BlueTooth (
ID int Primary Key NOT NULL ,
version varchar(45) NOT NULL,
score float null,
speed float 
);

我的触发器是

create or replace trigger BlueToothsc
ON BlueTooth 
after insert 
as 
begin 
update BlueTooth set score((select speed from inserted)/(select max(speed) from BlueTooth ) * 100)
END 
GO

但我在第一行的 "incorrect syntax near" "or" 关键字中遇到错误 和"incorrect syntax near" "as"

有人可以帮我解决这个问题

我想通过 (inserted speed / max(speed) ) * 100) 更新 BlueToothscore

当一个更快的蓝牙版本出现时,分值应该是 100 并且所有其他的应该分别得到一个较低的值。

【问题讨论】:

  • 如果score 总是正确的,这肯定会更好地在视图中计算,而不是存储在表中。 IE。如果第一个插入的速度为1,然后另一个插入的速度为100,那么两个分数都是100。这真的是你想要的吗?
  • @Damien_The_Unbeliever 你是对的,当我运行触发器时它只会更改插入的行,你的例子是正确的,这不是我真正想要的。如果更快的蓝牙版本来了,我想更新所有的分值你有什么建议吗?

标签: sql sql-server triggers insertion


【解决方案1】:

而不是存储分数,而是在查询点计算它。因此,在这种情况下,视图应该完成这项工作:

create table BlueTooth (
ID int Primary Key NOT NULL ,
version varchar(45) NOT NULL,
speed float 
);
go
create view BlueToothScores
as
   select
       ID,
       version,
       speed,
       speed * 100 / MAX(speed) OVER () as score
   from
       BlueTooth

现在您无需担心触发器或更新例程 - 结果始终正确,因为它们是根据真实数据计算得出的

【讨论】:

    【解决方案2】:

    语法错误是

    1) You have to create or alter the trigger seperately
    2) missed = while assigning the value to score in update statement
    

    试试这个触发器。

    create trigger BlueToothsc
    ON BlueTooth 
    after insert 
    as 
    begin 
    update BlueTooth set score = ((select speed from inserted)/
                 (select max(speed) from BlueTooth ) * 100)
    where ID = (SELECT ID FROM INSERTED)
    END 
    GO
    

    【讨论】:

    • 对于任何多行插入都将失败,并将 Bluetooth 中所有行的 score 更新为相同的值。第一个是错误,我很确定第二个不是 OP 所追求的。
    • @Damien_The_Unbeliever 没错,当我添加更大的值时,我可能需要一个过程来更新所有行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多