Sql 如果使用触发器出现相同的名称,如何进行增量?
我有一张桌子:Sql 如果使用触发器出现相同的名称,如何进行增量?,sql,oracle,plsql,oracle11g,Sql,Oracle,Plsql,Oracle11g,我有一张桌子: id name amount 如果插入了相同的名称,则应增加金额。 否则,插入0个金额 如何在给定条件下创建触发器?您不应该这样做AMOUNT列有效地统计了该表中出现的NAME数量。你总是可以数的,不是吗?那么,这样做的目的是什么 如果您想知道在其他名称(等于前一个名称)之前(或之后)插入了哪个名称,请按ID对它们进行排序(如果它是增量的,例如标识列,或者如果它从序列中获取其值) 如果ID不是递增的,则添加DATE\u INSERTED列(并按其排序;或应用ROW\u NUMB
id
name
amount
如果插入了相同的名称
,则应增加金额
。
否则,插入0个金额
如何在给定条件下创建触发器?您不应该这样做
AMOUNT
列有效地统计了该表中出现的NAME
数量。你总是可以数的,不是吗?那么,这样做的目的是什么
如果您想知道在其他名称(等于前一个名称)之前(或之后)插入了哪个名称,请按ID
对它们进行排序(如果它是增量的,例如标识列,或者如果它从序列中获取其值)
如果ID
不是递增的,则添加DATE\u INSERTED
列(并按其排序;或应用ROW\u NUMBER
分析函数,该函数按DATE\u INSERTED
排序值)
另外,如果删除其中一个重复的名称,会发生什么情况?对于该名称
之前的所有实例,是否会追溯递减金额
列
但是,如果你坚持,这里有一个选择。由于不能只从插入的表中进行选择(因为发生了变异表错误),所以我使用了复合触发器。“插入金额0”部分是通过设置列的默认值来完成的(不需要任何代码) 测试:
SQL> insert into test (id, name) values (1, 'little');
1 row created.
SQL> insert into test (id, name) values (2, 'foot');
1 row created.
SQL> insert into test (id, name) values (3, 'little');
1 row created.
SQL> insert into test (id, name) values (9, 'little');
1 row created.
SQL> select * from test;
ID NAME AMOUNT
---------- -------------------- ----------
1 little 1
2 foot 1
3 little 2
9 little 3
SQL>
或者,更简单的解决方案(如上所述),无需使用那么多代码:
SQL> select id, name,
2 row_number() over (partition by name order by id) as amount
3 from test;
ID NAME AMOUNT
---------- -------------------- ----------
2 foot 1
1 little 1
3 little 2
9 little 3
SQL>
你真的不应该那样做
AMOUNT
列有效地统计了该表中出现的NAME
数量。你总是可以数的,不是吗?那么,这样做的目的是什么
如果您想知道在其他名称(等于前一个名称)之前(或之后)插入了哪个名称,请按ID
对它们进行排序(如果它是增量的,例如标识列,或者如果它从序列中获取其值)
如果ID
不是递增的,则添加DATE\u INSERTED
列(并按其排序;或应用ROW\u NUMBER
分析函数,该函数按DATE\u INSERTED
排序值)
另外,如果删除其中一个重复的名称,会发生什么情况?对于该名称
之前的所有实例,是否会追溯递减金额
列
但是,如果你坚持,这里有一个选择。由于不能只从插入的表中进行选择(因为发生了变异表错误),所以我使用了复合触发器。“插入金额0”部分是通过设置列的默认值来完成的(不需要任何代码) 测试:
SQL> insert into test (id, name) values (1, 'little');
1 row created.
SQL> insert into test (id, name) values (2, 'foot');
1 row created.
SQL> insert into test (id, name) values (3, 'little');
1 row created.
SQL> insert into test (id, name) values (9, 'little');
1 row created.
SQL> select * from test;
ID NAME AMOUNT
---------- -------------------- ----------
1 little 1
2 foot 1
3 little 2
9 little 3
SQL>
或者,更简单的解决方案(如上所述),无需使用那么多代码:
SQL> select id, name,
2 row_number() over (partition by name order by id) as amount
3 from test;
ID NAME AMOUNT
---------- -------------------- ----------
2 foot 1
1 little 1
3 little 2
9 little 3
SQL>
读一下。。您应该更改应用程序的设计,而不是在触发器中实现此类业务逻辑。如果要查看表中数据的聚合形式,请创建并使用视图。这个问题是在我的评估工作中提出的,我不知道如何编写这样的查询阅读此。。您应该更改应用程序的设计,而不是在触发器中实现此类业务逻辑。如果您想查看表中数据的聚合形式,请创建并使用视图。这个问题是在我的评估工作中提出的,我不知道如何编写这样的查询。顺便说一句,这个问题是在评估任务中提出的,并声明为:创建仅对表雇员的插入语句作出反应的触发器。并根据数据库中已存在的同名员工数为samename分配一个+1的数字。这仅适用于单用户环境。假设一个会话插入了
“little”
,但没有提交。然后另一个会话也进入“little”
。除非提交第一次插入,否则数据将是错误的。正如Littlefoot恰当地指出的那样:您不应该真的这样做。顺便说一下,在评估任务中提出了一个问题,并声称:创建一个只对表employee的插入语句作出反应的触发器。并根据数据库中已存在的同名员工数为samename分配一个+1的数字。这仅适用于单用户环境。假设一个会话插入了“little”
,但没有提交。然后另一个会话也进入“little”
。除非提交第一次插入,否则数据将是错误的。正如Littlefoot所说:你不应该真的那样做。