现在表结构和数据如下所示:
Name record_number Area
a 1 CN
a 3 DE
a 4 FR
a 6 DE
b 1 DE
b 2 CN
主键是(name,record_number)
record_nubmer是由max(record_number)+ 1生成的,只是假设有两条记录被record_number = 2/5和name ='a'删除了,所以任何人都可以告诉我如何删除表中的record_nubmer空白在删除之后,最终结果应如下所示:
Name record_number Area
a 1 CN
a 2 DE
a 3 FR
a 4 DE
b 1 DE
b 2 CN
答案 0 :(得分:0)
您可以使用delete
命令更新记录,例如:
update my_table set record_number = record_number - 1
where name = :old.name and record_number > :old.record_number
我不确定您是否可以创建此触发器(我现在无法访问Oracle部署)。
尝试创建这样的触发器(删除每一行后),如果没有,则更新应用程序,所以每次删除后,上面的查询都会被执行。
另一个解决方案是,执行以下查询:
select name, record_number, rank() over (partition by name order by record_number) new_record_number
from my_table
现在迭代结果,然后执行:
update my_table
set record_number = :new_record_number
where name = :name and
record_number = :record_number
整个事物可以成为存储过程,然后在每个删除命令后调用它。
答案 1 :(得分:0)
受@AmirPashazadeh rank()
的启发,这是一个单线解决方案:
UPDATE my_table t3
SET record_number=(SELECT
t2.rank
FROM my_table t1
INNER JOIN (SELECT
name,
record_number,
rank() over (partition by name ORDER BY record_number) rank
FROM my_table) t2 ON (t1.name=t2.name AND t1.record_number=t2.record_number)
WHERE t1.name=t3.name AND t1.record_number=t3.record_number);