すべてのプロダクト
Search
ドキュメントセンター

Hologres:PostgreSQL SERIAL

最終更新日:Jan 11, 2025

Hologres は PostgreSQL と互換性があり、SERIAL または BIGSERIAL データ型を使用してテーブルに自動インクリメントフィールドを作成できます。

データ型の概要

Hologres では、SERIAL または BIGSERIAL データ型を使用して、テーブルに自動インクリメントフィールドを作成できます。 SERIAL データ型は、自動インクリメントフィールドのデータ型が INT4 であることを示します。 BIGSERIAL データ型は、自動インクリメントフィールドのデータ型が INT8 であることを示します。

このトピックでは、SERIAL データ型の自動インクリメントフィールドを使用例として使用します。次の SQL ステートメント例は、テーブルで SERIAL データ型を使用して colname という名前の自動インクリメントフィールドを作成する方法を示しています。サンプルステートメントの構文は、BIGSERIAL データ型にも適用されます。
CREATE TABLE tablename (
    colname serial
);

制限事項

  • Hologres では、インクリメントステップサイズやデフォルト値など、SERIAL および BIGSERIAL データ型の追加パラメーターを指定することはできません。デフォルトでは、インクリメントステップサイズの値は 1、デフォルト値は 1 です。
  • Hologres では、データ型が SMALLSERIAL のデータを使用することはできません。
  • データ型が SERIAL および BIGSERIAL のフィールドを持つテーブルを初めて作成するには、スーパーユーザーがデータベースにテーブルを作成する必要があります。たとえば、スーパーユーザーが create table test(a serial); ステートメントを実行した後、他のユーザーはビジネスロジックに基づいて、データ型が SERIAL および BIGSERIAL のフィールドを持つテーブルを作成できます。データ型が SERIAL および BIGSERIAL のフィールドを持つテーブルは、データベースレベルのテーブルです。別のデータベースに切り替える場合は、スーパーユーザーが新しいデータベースで上記のステートメントを実行する必要があります。
  • Flink モードおよび SDK(高速書き込み)モードでは、SERIAL および BIGSERIAL データ型のフィールドにデータを書き込むことはできません。 insert into xxx select ステートメントが実行された後にのみ、これらのフィールドにデータを書き込むことができます。
  • Hologres V0.10 以後でのみ、restart with オプション句で SERIAL データ型のパラメーターを変更できます。

例 1:SQL ステートメントを実行して自動インクリメントフィールドを作成する

次の SQL ステートメント例は、SERIAL データ型を使用して自動インクリメントフィールドを作成する方法を示しています。サンプル SQL ステートメントの構文は、BIGSERIAL データ型にも適用されます。
// id フィールドと f1 フィールドを含むテーブルを作成します。
create table if not exists test_tb(id serial primary key, f1 text);

// INSERT ステートメントを実行して、f1 フィールドにデータを挿入します。
insert into test_tb(f1) values('1');
insert into test_tb(f1) values('2');
insert into test_tb(f1) values('3');

// test_tb テーブルのデータをクエリし、id フィールドで昇順にデータをソートします。
select * from test_tb order by id asc;

例 2:JDBC 経由で Hologres に接続し、自動インクリメントフィールドを作成する

次の SQL ステートメント例は、Java Database Connectivity(JDBC)経由で Hologres に接続し、SERIAL データ型を使用して自動インクリメントフィールドを作成する方法を示しています。サンプル SQL ステートメントの構文は、BIGSERIAL データ型にも適用されます。
package test;

import java.sql.*;

public class HoloSerial {

// id フィールドと f1 フィールドを含むテーブルを作成します。
    private static void Init(Connection conn) throws Exception {
        try (Statement stmt = conn.createStatement()) {
            stmt.execute("drop table if exists test_tb;");
            stmt.execute("create table if not exists test_tb(id serial primary key, f1 text);");
        }
    }

// f1 フィールドにデータを挿入します。
    private static void TestSerial(Connection conn) throws Exception {
        try (PreparedStatement stmt = conn.prepareStatement("insert into test_tb(f1) values(?)")) {
            for (int i = 0; i < 100; ++i) {
                stmt.setString(1, String.valueOf(i + 1));
                int affected_rows = stmt.executeUpdate();
                System.out.println("affected rows => " + affected_rows);
            }
        }

// test_tb テーブルのデータをクエリし、id フィールドで昇順にデータをソートします。
        try (PreparedStatement stmt = conn.prepareStatement("select * from test_tb order by id asc")) {
            try(ResultSet rs = stmt.executeQuery()) {
                while(rs.next()) {
                    String res = rs.getObject(1).toString() + "\t" + rs.getObject(2).toString();
                    System.out.println(res);
                }
            }
        }
    }

// JDBC 経由で Hologres に接続します。
    public static void main(String[] args) throws Exception {
        Class.forName("org.postgresql.Driver").newInstance();
        String host = "127.0.0.1:13737";
        String db = "postgres";
        String user = "xx";
        String password = "xx";
        String url = "jdbc:postgresql://" + host + "/" + db;
        try (Connection conn = DriverManager.getConnection(url, user, password)) {
            Init(conn);

            TestSerial(conn);
        }
    }
}

例 3:SERIAL データ型のパラメーターを変更する

SERIAL データ型のパラメーターを使用してテーブルを作成すると、schema_name.tablename_columnname_seq という名前のシーケンスが自動的に生成されます。 ALTER SEQUENCE ステートメントを実行して、SERIAL データ型のパラメーターを変更できます。手順は以下のとおりです。

  1. 次のステートメントを実行して、生成されたシーケンスをクエリします。ステートメント内の table_schematable_name、および column_name を、ビジネス要件に基づいて実際の値に置き換える必要があります。例 1 で作成されたテーブルが、次のサンプルステートメントで使用されます。
    select table_name,column_name,column_default  from information_schema.columns where table_schema='ods' and table_name = 'test_tb' and column_name = 'id';
    次の図は、クエリ結果を示しています。Query resultsクエリ結果では、単一引用符(' ')で囲まれた部分 ods.test_tb_id_seq がシーケンス名を示します。
  2. シーケンス名を取得したら、次のステートメントを実行して、restart with オプション句で SERIAL データ型のパラメーターを変更します。
    alter sequence ods.test_tb_id_seq restart with 100
    ビジネス要件に基づいて、ステートメント内の ods.test_tb_id_seq と数値を他の値に置き換えることができます。パラメーターを変更したら、テーブルにデータを挿入して結果を確認します。