【问题标题】:How to trigger a table to change the value of another table column如何触发一个表改变另一个表列的值
【发布时间】:2016-04-22 16:19:01
【问题描述】:

我已经创建了三个表。

CREATE TABLE Clients
(
    ClientID INT IDENTITY(1,1) PRIMARY KEY,
    First_Name VARCHAR(50) NOT NULL,
    Last_Name VARCHAR(50) NOT NULL,
)
CREATE TABLE Reservation
(
    ReservationID INT IDENTITY(1,1) PRIMARY KEY,
    ClientID INT FOREIGN KEY (ClientID) REFERENCES Clients(ClientID),
    Reservation_paid VARCHAR(3) DEFAULT 'NO',
)
CREATE TABLE Payment
(
    Payment_ID INT IDENTITY(1,1) PRIMARY KEY,
    ClientID INT FOREIGN KEY (ClientID) REFERENCES Clients(ClientID),
    ReservationID INT FOREIGN KEY (ReservationID) REFERENCES Reservation(ReservationID),
)

每当客户支付预订时,我想在预订表中将 Reservation_paid 列的值更改为 YES,并且我想使用触发器自动完成。

示例:如果 Reservation 表中的 ClientID 自动存在于 Payment 表中,则 Reservation_paid 的值将设置为 YES。 提前谢谢你。

【问题讨论】:

  • 你应该用你正在使用的数据库标记你的问题。

标签: sql sql-server dynamic triggers


【解决方案1】:
CREATE TRIGGER trgAfterInsert ON [dbo].[Payment] 
FOR INSERT
AS
declare @ClientID int;
select @ClientID =i.ClientID from inserted i;   

if update(ClientID)
    UPDATE Reservation set Reservation_paid='Yes' WHERE  
    ClientID=@ClientID;

--PRINT 'AFTER INSERT trigger fired.'

【讨论】:

    【解决方案2】:

    插入后触发器应该做这样的事情

    UPDATE R 
    SET    Reservation_paid = 'Yes' 
    FROM   reservation R 
    WHERE  EXISTS (SELECT 1 
                   FROM   INSERTED I 
                   WHERE  I.clientid = R.clientid 
                          AND I.reservationid = R.reservationid) 
    

    【讨论】:

      【解决方案3】:
      CREATE TRIGGER trgAfterInsert ON [dbo].[Payment] 
      FOR INSERT
      AS
      declare @ClientID int;
      select @ClientID =i.ClientID from inserted i;   
      insert into Reservation(ClientID,Reservation_paid)    
      values(@ClientID,'Yes');
      
      --PRINT 'AFTER INSERT trigger fired.'
      

      【讨论】:

        【解决方案4】:

        在表PaymentClientId 列上的任何insertupdate 之后,编写一个将作用于表Reservation 的触发器。然后将ClientIDReservation 表的ClientID 列匹配,并将对应的Reservation_paid 更新为YES。

        编辑: 触发器会是这样的

        CREATE TRIGGER `UpdateReservation_paid` AFTER INSERT OR UPDATE ON `Payment`
         FOR EACH ROW BEGIN
         AS 
        begin
         update Reservation 
         SET Reservation_paid='YES'
         Where NEW.ClientID = Reservation.ClientID 
               and NEW.ReservationID = Reservation.ReservationID   
        end
        

        【讨论】:

        • 我在 NEW.ClientID 和 NEW.ReservationID 处出现错误,并显示“找不到多部分标识符 'NEW.ClientID/NEW.ReservationID'”。和其他错误:after/or/on/each 但我认为这些是因为 Sql 语法。
        • 尝试用inserted 替换NEW 并删除OR UPDATE 并告诉我结果。
        • 我正在使用 sql server,这并没有修复错误,但我已经标记了完成这项工作的正确答案。谢谢。
        • 只是为了兴趣:最后的输出/错误消息是什么。
        • 抱歉耽搁了,但我仍然遇到同样的错误。 “After/On/row/begin 附近的语法不正确”以及您建议的替换单词的错误。
        猜你喜欢
        • 2020-11-01
        • 1970-01-01
        • 2020-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多