首页 > 解决方案 > 如何在 Oracle (PL SQL) 中重置标识列

问题描述

我需要编写一个脚本来将数据库中的所有自动递增字段重置为 0。

标签: sqloracleplsql

解决方案


我想分享解决问题的方法。

要获取表名列表,我执行以下操作:

SELECT T.TABLE_NAME FROM ALL_TAB_COLUMNS C
INNER JOIN ALL_TABLES T ON C.OWNER = T.OWNER AND C.TABLE_NAME = T.TABLE_NAME
WHERE T.OWNER = 'SCHEME'
AND C.DATA_DEFAULT IS NOT NULL

进一步在循环中,您可以生成动态sql,如下所示:

ALTER TABLE TABLE_NAME
MODIFY ID 
GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 1);

我们通过EXECUTE IMMEDIATE.

下面是我项目中的一个例子:

PROCEDURE RESET_ALL_IDENTITY_COLUMNS IS
BEGIN
  FOR TABLES_WITH_IDENTITY IN (SELECT T.TABLE_NAME FROM ALL_TAB_COLUMNS C
                               INNER JOIN ALL_TABLES T ON C.OWNER = T.OWNER AND C.TABLE_NAME = T.TABLE_NAME
                               WHERE T.OWNER = 'DZR'
                               AND C.DATA_DEFAULT IS NOT NULL)
  LOOP
    EXECUTE IMMEDIATE 'ALTER TABLE ' || TABLES_WITH_IDENTITY.TABLE_NAME || ' MODIFY ID GENERATED BY DEFAULT ' ||
                     'ON NULL AS IDENTITY (START WITH 1)';
  END LOOP;
END;

祝你好运 :)


推荐阅读