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

时间:2015-07-29 07:55:58

标签: oracle plsql sql-insert sql-delete

我怀疑删除用户表中的一行并在同一个表中添加新数据,而不是占用该行的位置,创建一个新行,实际上该实现是在用户序列中递增的每个1,因为你将新数据添加到用户表中,或许为了解决这个疑问,有必要使用函数或触发器

创建表用户和主键

/* 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  * from users;

enter image description here

如果delete id_user = 2喜欢

,那么疑问就是
/* delete user with id = 2 */
delete from users where id_user = 2;

/*select users*/
select  * from users;

enter image description here

如果我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;

enter image description here

事实上,sequence_userstart by id_user = 2starts at 3functiontriggersupdate sequence_user /* 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; 如果该行被删除

现在在PL / SQL

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;

现在我要删除此用户

C:\ABC\Uninst\<Variant-1>\<variant1-uninstaller>

1 个答案:

答案 0 :(得分:2)

绝不会,绝对不会保证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;