触发从另一个表中选择数据,然后将其更新到当前表SQL Server

时间:2013-05-16 17:07:47

标签: sql sql-server function triggers

请帮助我,我有一个简单的案例,让我有点疯狂,我有一个名为PRODUCTS的表,这里是结构

create table PRODUCT (
  ID_PRODUCT CHAR(5) primary key not null,
  NAME_PRODUCT CHAR(30),
  PRICE_PRODUCT integer
)

然后第二个表是TRANSACTION,这是表结构

create table TRANSACTION (
  ID_TRANSACTION CHAR(5) primary key not null,
  ID_PRODUCT CHAR(30) REFERENCES PRODUCTS(ID_PRODUCT),
  PRICE integer,
  QUANTITY integer
)

之后我想创建一个触发器,当用户将数据填充到ID_PRODUCT表中的TRANSACTIONS列时,它会自动触发,从列{{1}中获取/选择数据根据已插入的PRICEPRODUCTS表格中,然后更新表格ID_PRODUCT中的列PRICE

我是SQL Server的初学者,...我希望你能在这种情况下帮助我,因为我不知道&不知道我要做什么,谢谢

2 个答案:

答案 0 :(得分:1)

这样的事情可能会做你需要的事情:

CREATE TRIGGER UpdateTransaction 
ON [TRANSACTION] 
INSTEAD OF INSERT
AS 
BEGIN  

INSERT [TRANSACTION] (ID_TRANSACTION, ID_PRODUCT, PRICE, QUANTITY)
SELECT INSERTED.ID_TRANSACTION, INSERTED.ID_PRODUCT, PRODUCT.PRICE_PRODUCT, INSERTED.QUANTITY
FROM INSERTED
JOIN PRODUCT ON INSERTED.ID_PRODUCT = PRODUCT.ID_PRODUCT

END

它将运行正常插入的INSTEAD并将行INSERTED加入PRODUCT表,允许它插入右PRICE_PRODUCT。如果需要,你可以为UPDATE做类似的事情。

另一方面,TRANSACTION是一个桌子的可怕名称 - 它是reserved word in T-SQL(注意它会被你的编辑和这个网站突出显示?) - 它是语言的一部分,所以我会在对象名称中避免它。

也许这样命名你的表可能会更好:

TRANSACTION -> tbl_Transactions
PRODUCT -> tbl_Products

答案 1 :(得分:0)

您通过在两个连接的表中使用两列(ID 价格)来重复数据。我建议删除TRANSACTION.PRICE列。 您可以改为创建VIEW

CREATE VIEW V_Transaction AS
  SELECT
    TRANSACTION.ID_TRANSACTION,
    TRANSACTION.ID_PRODUCT,
    TRANSACTION.QUANTITY * PRODUCT.PRICE_PRODUCT as PRICE,
    TRANSACTION.QUANTITY
  FROM
    TRANSACTION
    JOIN ID_PRODUCT ON TRANSACTION.ID_PRODUCT = PRODUCT.ID_PRODUCT

没有必要(我看到)存储每个产品的价格和每笔交易的价格