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 データ型のパラメーターを変更できます。手順は以下のとおりです。
- 次のステートメントを実行して、生成されたシーケンスをクエリします。ステートメント内の table_schema、table_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';
クエリ結果では、単一引用符(' ')で囲まれた部分
ods.test_tb_id_seq
がシーケンス名を示します。 - シーケンス名を取得したら、次のステートメントを実行して、
restart with
オプション句で SERIAL データ型のパラメーターを変更します。
ビジネス要件に基づいて、ステートメント内のalter sequence ods.test_tb_id_seq restart with 100
ods.test_tb_id_seq
と数値を他の値に置き換えることができます。パラメーターを変更したら、テーブルにデータを挿入して結果を確認します。