sql >> データベース >  >> RDS >> PostgreSQL

自動インクリメントしますが、列の既存の値を省略します

    更新:後で、より詳細な回答:

    これはスムーズに機能するはずです:

    CREATE OR REPLACE FUNCTION f_next_free(_seq regclass)
      RETURNS integer AS
    $func$
    BEGIN
       LOOP
          PERFORM nextval(_seq);
          EXIT WHEN NOT EXISTS (SELECT 1 FROM db.t1 WHERE id = lastval());
       END LOOP; 
    
       RETURN lastval();
    END
    $func$  LANGUAGE plpgsql VOLATILE;
    

    ループは、テーブルにまだない番号が見つかるまで、指定されたシーケンスから次の番号をフェッチしています。 同時使用しても安全である必要があります 、まだシーケンスに依存しているためです。

    シリアル列のデフォルトの列でこの関数を使用します(シリアル列のデフォルトを置き換えるnextval('t1_id_seq'::regclass)

    ALTER TABLE db.t1 ALTER COLUMN id
    SET DEFAULT f_next_free('t1_id_seq'::regclass);
    

    lastval()のマニュアル

    これは、島が少なく、ギャップが多い場合にうまく機能します(例によるとそうです)。 施行する 一意性については、一意の制約を追加します 列の(または主キー)。



    1. Mysqlでこれを解決する方法(#1242-サブクエリは複数の行を返します)?

    2. col value!=指定された値の場合、MySQLはtrue/falseを返します

    3. ResultSetをストリーミングするときにMySQLConnector/ Jは行をバッファリングしますか?

    4. MyBatis、インサートの自動生成キーを取得する方法は? [MySql]