当从 table - PLSQL 中删除一行时修复以下 id 或更新序列

Fix following id's or update sequence when a row is deleted from a table - PLSQL

我对删除用户中的一行有疑问 table 并在同一行中添加新数据 table 但不是占用 off 的行,而是创建一个新行,在事实上,实现是在用户序列中,每次递增 1,因为您将新数据添加到用户的 table 中,也许要解决这个疑问,有必要使用函数或触发器

创建table 用户和主键

/* table user*/
create table users (id_user number(10) not null, 
                    name_user varchar(30) not null);

/* primary key */
alter table users add constraint user_pk primary key (id_user);

/* create sequence */
create sequence seq_user increment by 1 start with 1;

/* insert two user date */
insert into users(id_user, name_user) values(seq_user.NEXTVAL, 'Renata Souza');
insert into users(id_user, name_user) values(seq_user.NEXTVAL, 'Rihanna Smith');

select所有用户

select  * from users;

疑问是,如果我 delete id_user = 2 喜欢

/* delete user with id = 2 */
delete from users where id_user = 2;

/*select users*/
select  * from users;

如果我 insert 给用户多两个日期

insert into users(id_user, name_user) values(seq_user.NEXTVAL, 'Sara Carbonero');
insert into users(id_user, name_user) values(seq_user.NEXTVAL, 'Patricia Guedes');

/*select users*/
select  * from users;

事实上,sequence_user应该start by id_user = 2但是starts at 3,有没有functiontriggers能够updatesequence_user 如果行被删除

现在 PL/SQL

/* Create user */
    PROCEDURE create_user(p_name   IN VARCHAR2,
                          p_error  OUT NUMBER,
                          p_msg_error OUT VARCHAR2)
      IS
      BEGIN
        p_error := 0;
        INSERT INTO users (id_user, name_user) VALUES(seq_user.NEXTVAL, p_name)
    COMMIT;
      EXCEPTION
      WHEN OTHERS THEN
        p_error     := 1;
        p_msg_error := 'Error!'||SQLERRM;
      END create_user;

现在我要删除这个用户

PROCEDURE delete_user(
    p_id_user IN NUMBER,
    p_error OUT NUMBER,
    p_msg_error OUT VARCHAR2)
IS
BEGIN
  p_error := 0;
  DELETE FROM users  WHERE users.id_user = p_id_user;
  COMMIT;
EXCEPTION
WHEN OTHERS THEN
  p_error     := 1;
  p_msg_error := 'Error!'||SQLERRM;
END delete_user;

从来没有,绝对没有,保证 oracle 序列会给你一个不间断的数字序列。如果那是你想要的,那么你需要自己做

SELECT MAX(id)+1 ...

修改了创建用户程序

/* Create user */
    PROCEDURE create_user(p_name   IN VARCHAR2,
                          p_error  OUT NUMBER,
                          p_msg_error OUT VARCHAR2)
      IS
        l_nextUser NUMBER;
      BEGIN
        p_error := 0;
        SELECT MAX(id_user)+1
          INTO l_nextUser
          FROM users;

        INSERT INTO users (id_user, name_user) VALUES(l_nextUser, p_name)
    COMMIT;
      EXCEPTION
      WHEN OTHERS THEN
        p_error     := 1;
        p_msg_error := 'Error!'||SQLERRM;
      END create_user;