Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果使用触发器出现相同的名称,如何进行增量?_Sql_Oracle_Plsql_Oracle11g - Fatal编程技术网

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所说:你不应该真的那样做。