两张表 在一张表中插入数据时要使用触发器也更新另一张 有错误

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的数据库中怎么将一张表中数据插入另一张表,两张表都存在

SQL问题,怎么将一张表的某个字段更新为另一张表的字段

oracle通过两张表更新一张表

SQL怎么把查询的结果插入到另一张表中,两张表的表结构不一样可以吗?

oracle中怎么如何把两张表中查询到的数据求和,

在oracle中怎么把一张表的数据插入到另一张表中