自动设置Oracle的序列起始值

时间:2013-10-29 18:25:59

标签: oracle plsql sequence

我有很多现有的表,每个表都有一个名为'id'的列。此列具有从1开始的整数值。例如,表MY_TABLE包含3条记录,其中ID为1,2和3(超级基本)。

我想为每个表创建一个序列,并使用表的最大id设置其起始值。在我的例子中,我需要这样的东西:

CREATE SEQUENCE MY_TABLE_SEQ START WITH 3 INCREMENT BY 1;

我尝试过类似的东西,但它不起作用:

CREATE SEQUENCE MY_TABLE_SEQ START WITH (SELECT NVL(MAX(id),1) FROM MY_TABLE) INCREMENT BY 1;

知道我可以做什么吗?

由于

2 个答案:

答案 0 :(得分:5)

DECLARE
    MAXVAL MY_TABLE.ID%TYPE;
BEGIN
    SELECT NVL(MAX(id),1) INTO MAXVAL FROM MY_TABLE;
    EXECUTE IMMEDIATE 'CREATE SEQUENCE MY_TABLE_SEQ START WITH ' || MAXVAL || ' INCREMENT BY 1';
END
/

您也可以在创建序列后对其进行更改。

有关该主题的一些读物:http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:951269671592

答案 1 :(得分:2)

您可以生成CREATE SEQUENCE命令:

CREATE TABLE test_tab1 (
  id number
);

CREATE TABLE test_tab2 (
  id number
);

INSERT INTO test_tab1 VALUES (20);
INSERT INTO test_tab2 VALUES (40);

COMMIT;

DECLARE
  v_max_id NUMBER;
BEGIN
  FOR v_table IN (SELECT table_name
                    FROM user_tables
                  WHERE table_name IN ('TEST_TAB1', 'TEST_TAB2'))
  LOOP
    EXECUTE IMMEDIATE 'SELECT NVL(MAX(id), 1) FROM ' || v_table.table_name
      INTO v_max_id;
    dbms_output.put_line(
      'CREATE SEQUENCE ' || upper(v_table.table_name) || '_SEQ START WITH ' || v_max_id || ' INCREMENT BY 1;');
  END LOOP;
END;

输出:

CREATE SEQUENCE TEST_TAB1_SEQ START WITH 20 INCREMENT BY 1;
CREATE SEQUENCE TEST_TAB2_SEQ START WITH 40 INCREMENT BY 1;