加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – SQL:如何插入自定义增量值

发布时间:2020-12-13 16:10:40 所属栏目:PHP教程 来源:网络整理
导读:目前我有一个表格如下: Year | Branch_Code | Registration_Number | ...______________________________________________2018 | BRANCH1 | 1 | ...2018 | BRANCH1 | 2 | ...2018 | BRANCH2 | 1 | ... 因此,每次我将数据插入表中时,我都希望Registration_Nu
目前我有一个表格如下:

Year | Branch_Code | Registration_Number | ...
______________________________________________
2018 | BRANCH1     | 1                   | ...
2018 | BRANCH1     | 2                   | ...
2018 | BRANCH2     | 1                   | ...

因此,每次我将数据插入表中时,我都希望Registration_Number自动递增,并依赖于Year和Branch_Code.我试图先获取最大值并稍后插入,但如果我的客户同时插入,它有时会插入重复的数字.

有人有任何解决方案吗?

附:我正在使用Laravel Framework和Oracle数据库.

解决方法

我建议你使用序列并停止担心它.

或者,您可以尝试这样的事情:

>创建一个表(我的例子中的regnum),它保存[year,branch_code]组合的最后一个registration_number
>在一个自治事务的函数中增加它(以便它的COMMIT不会影响主事务)
>在触发器中填充目标表(在我的示例中为yourt)

这是如何做:

表格首先:

SQL> create table yourt (year number,branch_code varchar2(20),registration_number number,datum date);

Table created.

SQL> create table regnum (year number,registration_number number);

Table created.

功能:

SQL> create or replace function f_regnum (par_year in number,par_branch_code in varchar2)
  2    return number
  3  is
  4    pragma autonomous_transaction;
  5    l_nextval number;
  6  begin
  7    select registration_number + 1
  8      into l_nextval
  9      from regnum
 10      where year = par_year
 11        and branch_code = par_branch_code
 12    for update of registration_number;
 13
 14    update regnum set
 15      registration_number = l_nextval
 16      where year = par_year
 17        and branch_code = par_branch_code;
 18
 19    commit;
 20    return (l_nextval);
 21
 22  exception
 23    when no_data_found then
 24      lock table regnum in exclusive mode;
 25
 26      insert into regnum (year,branch_code,registration_number)
 27      values (par_year,par_branch_code,1);
 28
 29      commit;
 30      return(1);
 31  end;
 32  /

Function created.

触发:

SQL> create or replace trigger trg_bi_yourt
  2    before insert on yourt
  3    for each row
  4  begin
  5    :new.registration_number := f_regnum(:new.year,:new.branch_code);
  6  end;
  7  /

Trigger created.

测试:

SQL> insert into yourt (year,datum) values (2017,'branch 1',date '2017-01-01');

1 row created.

SQL> insert into yourt (year,date '2017-01-25');

1 row created.

SQL> insert into yourt (year,'branch 2',date '2017-04-14');

1 row created.

SQL> insert into yourt (year,datum) values (2018,'branch 3',date '2018-07-11');

1 row created.

SQL> insert into yourt (year,date '2018-05-21');

1 row created.

SQL> insert into yourt (year,date '2018-03-14');

1 row created.

SQL> insert into yourt (year,date '2018-05-17');

1 row created.

结果:

SQL> select * from yourt order by branch_code,year;

      YEAR BRANCH_CODE          REGISTRATION_NUMBER DATUM
---------- -------------------- ------------------- ----------
      2017 branch 1                               2 2017-01-25
      2017 branch 1                               1 2017-01-01
      2018 branch 1                               1 2018-05-21
      2017 branch 2                               1 2017-04-14
      2018 branch 3                               2 2018-03-14
      2018 branch 3                               3 2018-05-17
      2018 branch 3                               1 2018-07-11

7 rows selected.

SQL> select * from regnum order by branch_code,year;

      YEAR BRANCH_CODE          REGISTRATION_NUMBER
---------- -------------------- -------------------
      2017 branch 1                               2
      2018 branch 1                               1
      2017 branch 2                               1
      2018 branch 3                               3

SQL>

该解决方案将在多用户环境中工作,不会引发变异表错误,但如果您一次加载大量行(例如,使用SQL * Loader),性能可能(将)受到影响.再次使用序列.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读