当从 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
,有没有function
或triggers
能够update
sequence_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;
我对删除用户中的一行有疑问 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
,有没有function
或triggers
能够update
sequence_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;