两张表 在一张表中插入数据时要使用触发器也更新另一张 有错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两张表 在一张表中插入数据时要使用触发器也更新另一张 有错误相关的知识,希望对你有一定的参考价值。
ALTER TRIGGER [dbo].[ifid]
ON [dbo].[光盘入库信息]
AFTER INSERT,DELETE,UPDATE
AS
DECLARE @a int,
@id char(10),
@名称 nvarchar(50),
@原价 money,
@库存量 int,
@进货数量 int
SET @id=(SELECT 光盘ID FROM INSERTED)
SET @名称=(SELECT 光盘名称 FROM INSERTED)
SET @原价 = (SELECT [原价(元)] FROM INSERTED)
SET @库存量 = (SELECT 库存量 FROM 光盘信息) + (SELECT 数量 FROM INSERTED)
SET @进货数量 = (SELECT 数量 FROM INSERTED)
BEGIN
IF ((SELECT count(*) FROM 光盘信息 WHERE 光盘ID=@id)<1)
BEGIN
PRINT '此书尚未拥有ID,系统已为其分配ID!'
INSERT INTO 光盘信息
VALUES(@id,@名称,@原价,@进货数量,0,0)
END
ELSE
BEGIN
PRINT '已成功入库'
UPDATE 光盘信息
SET 库存量 = @库存量
WHERE 光盘信息.光盘ID = (SELECT 光盘ID FROM INSERTED)
END
SET NOCOUNT ON;
END
错误
消息 512,级别 16,状态 1,过程 ifid,第 19 行
子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。
语句已终止。
WHY WHY WHY
可能出错的地方有:
SET @id=(SELECT 光盘ID FROM INSERTED)
SET @名称=(SELECT 光盘名称 FROM INSERTED)
SET @原价 = (SELECT [原价(元)] FROM INSERTED)
SET @库存量 = (SELECT 库存量 FROM 光盘信息) + (SELECT 数量 FROM INSERTED)
SET @进货数量 = (SELECT 数量 FROM INSERTED)
UPDATE 光盘信息
SET 库存量 = @库存量
WHERE 光盘信息.光盘ID = (SELECT 光盘ID FROM INSERTED)
这些地方都是用了子查询,那最后一个来说“SELECT 光盘ID FROM INSERTED”查出多于一行的结果时,要将值赋给光盘ID,但是有多个值,数据库就不知道要给哪个值了。所以报错。
解决方法:前5个语句增加where条件,确保查询结果唯一
update语句改用in,不用=
这样写:
UPDATE 光盘信息
SET 库存量 = @库存量
WHERE 光盘信息.光盘ID in (SELECT 光盘ID FROM INSERTED) 参考技术A 你赋值的时候要确保返回值只有一个
如SET @id=(SELECT 光盘ID FROM INSERTED)
可能同时插入了多笔资料,你这个就有问题,你应该判断插入或更新资料的笔数并决定是否要用到循环来处理。追问
对噢 我还没想到同时插入多个数据。。。
我晕 那我应该怎么改啊。。。
你可以判断inserted表的资料笔数,如果是一笔就不用循环,如果是多笔就可以循环或集合操作。
本回答被提问者采纳以上是关于两张表 在一张表中插入数据时要使用触发器也更新另一张 有错误的主要内容,如果未能解决你的问题,请参考以下文章
oracle的数据库中怎么将一张表中数据插入另一张表,两张表都存在