首页 > 解决方案 > 如何在 Oracle APEX 中重置序列或在没有序列和触发器的情况下自动填充我的 PK,每次删除数据时从数字 1 开始?

问题描述

我有这张桌子

TABLE  "KEYWORD_RSLT" 
   (    "ID" NUMBER PRIMARY KEY, 
    "SESSION_MONTH" VARCHAR2(40) NOT NULL ENABLE, 
    "PATIENT_NAME" VARCHAR2(50)

我有这个程序可以将数据导入我的表 KEYWORD_RSLT。

create or replace PROCEDURE "PR_KEYWORD_SEARCH" (v_patient_id NUMBER, v_keyWord varchar2)
IS

BEGIN
   
    delete from KEYWORD_RSLT;

    insert into KEYWORD_RSLT (SESSION_MONTH, PATIENT_NAME)
        select distinct
            to_char(s.SESSION_DATE, 'MM-YYYY') as SESSION_MONTH,
            p.FIRST_NAME ||' '||p.LAST_NAME as PATIENT_NAME
        from SESSIONS s,
            CLIENTS p
        where s.CLIENTS_ID = p.ID
        and (s.CRITICAL_POINT like LOWER ('%'||v_keyWord||'%') and s.CLIENTS_ID = v_patient_id 
        or s.ACTIONS like LOWER ('%'||v_keyWord||'%') and s.CLIENTS_ID = v_patient_id);
END PR_KEYWORD_SEARCH;

我希望我的主键“ID”从 1 开始自动获取下一个可用数字,但是当我的程序从该表中删除所有数据时,我想从 1 重新开始。

我尝试使用序列(“SQ_KEYWORD_RSLT_INCREAMENT”)并触发,但我无法使用此代码从新过程中重置此序列:

alter sequence SQ_KEYWORD_RSLT_INCREAMENT restart start with 1;

每次删除所有数据时,如何从头开始自动填写我的 ID?

标签: oracle11goracle-sqldeveloperoracle-apexoracle-apex-5oracle-apex-5.1

解决方案


你说我不能重置这个序列,但你没有说为什么,所以我假设你有一个错误。不能直接在 pl/sql 中执行 ddl 语句,但可以使用EXECUTE IMMEDIATE.

CREATE SEQUENCE koen_s START WITH 1;

Sequence KOEN_S created.

SELECT koen_s.NEXTVAL FROM DUAL;

   NEXTVAL
----------
         1

BEGIN
  EXECUTE IMMEDIATE 'ALTER SEQUENCE koen_s RESTART START WITH 1';
END;
/

PL/SQL procedure successfully completed.

SELECT koen_s.NEXTVAL FROM DUAL;

   NEXTVAL
----------
         1


推荐阅读