【问题标题】:How to copy a column value to other column of same database table whenever a new record is inserted?每当插入新记录时,如何将列值复制到同一数据库表的其他列?
【发布时间】:2016-02-08 17:24:37
【问题描述】:

我有以下数据库表:

Book {Id(primary Key), Name, TotalNoOfCopies, NoOfCopiesAvailable}

我希望每当插入新记录/行时,NoOfCopiesAvailabe 列包含的值与 TotalNoOfCopies 列中的值相同。
我尝试使用以下成功触发器:

for insert
as declare @id nvarchar(10),@name varchar(50),@author varchar(40),@totalNoOfCopies tinyint, @availableNoOfCOpies tinyint;
select @id=i.Id from inserted i;
select @name=i.Name from inserted i;
select @author=i.Author from inserted i;
select @totalNoOfCopies=i.TotalNoOfCopies from inserted i;
select @availableNoOfCopies=i.TotalNoOfCopies from inserted i;
delete from Book where Id=@id;
insert into Book values(@id,@name,@author,@totalNoOfCopies,@availableNoOfCOpies);

但它执行 3 次交易:
1.用于插入新记录
2.用于删除该新记录
3.用于插入具有 NoOfCopiesAvailable=TotalNoOfCopies 的新记录

例如:

Insert into Book values('123','Book','Author',5,null)

消息:
1 行受影响
1 行受影响
1 行受影响


我想知道是否有任何方法可以在单个事务中执行此操作?

【问题讨论】:

    标签: sql sql-server database-design triggers


    【解决方案1】:

    您是否需要 INSTEAD OF INSERT 触发器:

    CREATE TRIGGER Book_i ON Book
    INSTEAD OF INSERT
    AS
    BEGIN
        INSERT INTO Book (
            Id,
            Name,
            TotalNoOfCopies, 
            NoOfCopiesAvailable
        ) SELECT
            Id,
            Name,
            TotalNoOfCopies,
            TotalNoOfCopies
        ) FROM
            INSERTED
    END
    GO
    

    很明显很优雅。

    【讨论】:

    • 非常感谢。有效。但仍有两笔交易。有什么方法可以在单个插入命令中实现。除了使用触发器还有其他方法吗?谢谢。
    • 您似乎误解了交易。这是一个影响 2 个操作的事务。为确保单笔交易,您应该将代码放入 begin transactioncommit 语句中。
    【解决方案2】:

    我宁愿修复表格设计并改为使用 NumberOfCopiesSold,默认情况下可以为 0。

    【讨论】:

      猜你喜欢
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      • 2014-01-26
      • 1970-01-01
      • 1970-01-01
      • 2021-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多