sql >> Databasteknik >  >> RDS >> Oracle

Återställ Oracle Sequence till att ha MIN VÄRDE =1 och START-nummer från 1

Du kan göra det i två steg:

  • increment_by value ett mindre än sekvensens nuvarande värde.
  • återställ increment_by till 1.

Logiken är att du inte ska minska sekvensen tillbaka till noll , eftersom minvärde du vill ha är 1 , så nästa val kan inte vara mindre än minval .

Till exempel,

SQL> CREATE SEQUENCE s START WITH 20 MINVALUE 0 INCREMENT BY 1;

Sequence created.

SQL> SELECT s.nextval FROM dual;

   NEXTVAL
----------
        20

SQL> ALTER SEQUENCE s INCREMENT BY -19 MINVALUE 1;

Sequence altered.

SQL> SELECT s.nextval FROM dual;

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

SQL> ALTER SEQUENCE s INCREMENT BY 1 MINVALUE 1;

Sequence altered.

SQL> SELECT s.nextval FROM dual;

   NEXTVAL
----------
         2

SQL> SELECT min_value, increment_by FROM user_sequences WHERE sequence_name='S';

 MIN_VALUE INCREMENT_BY
---------- ------------
         1            1

Så, min_värde och öka_med är nu återställt till 1 respektive. nästa värde kan vara 1 bara en gång innan du återställer increment_by till 1 om igen.

Så jag ser ingen praktisk användning av det du vill uppnå. Det kan dock göras som visas ovan.

För att implementera ovanstående logik i din procedur, gör följande:

Inställningar

SQL> DROP SEQUENCE S;

Sequence dropped.

SQL> CREATE SEQUENCE s START WITH 20 MINVALUE 0 INCREMENT BY 1;

Sequence created.

SQL> SELECT s.nextval FROM dual;

   NEXTVAL
----------
        20

Ändra din procedur som:

SQL> CREATE OR REPLACE PROCEDURE reset_seq(
  2      p_seq_name IN VARCHAR2 )
  3  IS
  4    l_val NUMBER;
  5  BEGIN
  6    EXECUTE IMMEDIATE 'select ' || p_seq_name || '.nextval from dual' INTO l_val;
  7    l_val := l_val - 1;
  8    dbms_output.put_line('l_val = '||l_val);
  9    EXECUTE IMMEDIATE 'alter sequence ' ||
 10                       p_seq_name || ' increment by -' || l_val || ' minvalue 1';
 11    EXECUTE IMMEDIATE 'select ' || p_seq_name || '.nextval from dual' INTO l_val;
 12    dbms_output.put_line('1st Nextval is '||l_val);
 13    EXECUTE IMMEDIATE 'alter sequence ' || p_seq_name ||
 14                      ' increment by 1 MINVALUE 1';
 15    EXECUTE IMMEDIATE 'select ' || p_seq_name || '.nextval from dual' INTO l_val;
 16    dbms_output.put_line('2nd Nextval is '||l_val);
 17  END;
 18  /

Procedure created.

SQL> SET serveroutput ON
SQL> EXEC reset_seq('S');
l_val = 20
1st Nextval is 1
2nd Nextval is 2

PL/SQL procedure successfully completed.

SQL>
SQL> SELECT min_value, increment_by FROM user_sequences where sequence_name='S';

 MIN_VALUE INCREMENT_BY
---------- ------------
         1            1

Som jag sa, Jag ser ingen praktisk användning av det . Din nästa val är praktiskt taget endast användbar från 2 . När det är 1 måste du göra en ALTER SEQUENCE igen för att återställa increment_by tillbaka till 1 .




  1. Django AWS RDS MySQL-fel:(2026, 'SSL-anslutningsfel:error:00000001:lib(0):func(0):reason(1)')

  2. Eko i heredoc / nowdoc-syntax

  3. MySql:MyISAM vs. Inno DB!

  4. Hämta alla nyheter och alla kommentarer