日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

自增序列Serial(Beta)

實時數(shù)倉Hologres兼容Postgres生態(tài),支持在建表時將字段的類型定義為Serial和Bigserial來定義自增的字段。

數(shù)據(jù)類型簡介

Hologres在建表時可以將字段的數(shù)據(jù)類型定義為SerialBigserial。其中,Serial表示INT4類型的自增字段,Bigserial表示INT8類型的自增字段。

配置Serial類型的自增序列。如下以Serial類型為例,對表格中的colname字段實現(xiàn)自增,Bigserial類型同樣適用。

CREATE TABLE tablename (
    colname serial
);

參數(shù)說明

參數(shù)

說明

存儲大小

取值范圍

Serial

INT4類型的自增字段

4字節(jié)

-2147483648~2147483647

Bigserial

INT8類型的自增字段

8字節(jié)

-9223372036854775808~9223372036854775807

使用限制

  • Hologres不能指定Serial和Bigserial的額外參數(shù),包括遞增步長初始值參數(shù),遞增步長為1,初始值默認設置為1

  • Hologres暫不支持Smallserial類型的數(shù)據(jù)。

  • 首次創(chuàng)建Serial和Bigserial類型的表,需要Superuser在當前DB創(chuàng)建。例如Superuser執(zhí)行create table test(a serial); ,然后其余用戶就能按照業(yè)務邏輯創(chuàng)建有關Serial和Bigserial類型的表。創(chuàng)建Serial和Bigserial類型的表是DB級別的,如果切換數(shù)據(jù)庫, Superuser需要再次執(zhí)行該操作。

  • 在Flink或者數(shù)據(jù)集成寫入場景,僅Flink的JDBC模式和數(shù)據(jù)集成insert into模式支持寫入Serial和Bigserial類型,DataHub暫不支持寫入。

  • 對于基于主鍵的insert on conflict寫入場景,Serial類型不會嚴格保證字段的連續(xù)性增長,如需嚴格保序,請手動設置Serial的起始值。

  • Serial寫入會有額外鎖的開銷,不建議單條寫入時增加Serial類型,對寫入性能有降低,可以攢批寫入。同時如果SQL符合Fixed Plan特征,可以開啟如下GUC參數(shù),使Serial字段可以走Fixed Plan實現(xiàn)更高的寫入性能,詳情請參見Fixed Plan加速SQL執(zhí)行

    --數(shù)據(jù)庫級別開啟GUC, 支持含有Serial類型列的Fixed Plan寫入
    alter database <user_db> set hg_experimental_enable_fixed_dispatcher_autofill_series=on;
  • 僅Hologres V0.10及以上版本支持修改Serial參數(shù),且僅支持restart with參數(shù)的修改。

  • Serial寫入會有額外全局鎖的開銷,對寫入性能影響較大,在性能敏感場景謹慎使用。

示例一:使用SQL語句實現(xiàn)自增序列

如下以Serial類型為例,使用SQL語句實現(xiàn)自增序列,Bigserial類型同樣適用。

--創(chuàng)建表,包含id和f1兩個字段。
create table if not exists test_tb(id serial primary key, f1 text);

--在insert語句中,給f1字段插入數(shù)據(jù)。
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;

示例二:使用JDBC連接Hologres,實現(xiàn)自增序列

如下以Serial類型為例,使用JDBC連接Hologres實現(xiàn)自增序列,Bigserial類型同樣適用。

package test;

import java.sql.*;

public class HoloSerial {

//創(chuàng)建表,包含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字段插入數(shù)據(jù)。
    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);
        }
    }
}

示例三:修改Serial參數(shù)

當您在創(chuàng)建表時使用Serial參數(shù)時,創(chuàng)建完成會自動生成一個名為schema_name.tablename_columnname_seq的Sequence,您可以通過修改Sequence參數(shù)控制Serial的生成方式。具體操作方法如下所示:

  1. 執(zhí)行如下代碼查看生成的Sequence,其中,table_schematable_namecolumn_name的取值需要修改為實際的名稱。本示例以示例一創(chuàng)建的表信息為例進行說明。

    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為Sequence名稱。

  2. 在獲取到Sequence名稱之后,您可以執(zhí)行如下示例語句,對Serial的restart with參數(shù)進行修改。

    alter sequence ods.test_tb_id_seq restart with 100

    其中,ods.test_tb_id_seq名稱和具體數(shù)量您可以按照實際業(yè)務內(nèi)容進行修改。修改完成后,您可以給表中插入數(shù)據(jù)進行驗證。

常見問題

  • 問題1:創(chuàng)建帶Serial類型的表報錯。

    • 問題現(xiàn)象

      創(chuàng)建帶Serial類型的表時,出現(xiàn)如下報錯提示。

      ERROR:permission denied schema hologres
    • 問題原因

      superuser未創(chuàng)建一個Serial類型的示例表。

    • 解決方法

      第一次在數(shù)據(jù)庫創(chuàng)建Serial類型的表時,需要superuser先創(chuàng)建一個示例表,例如superuser執(zhí)行create table test(a serial); ,其余用戶就能按照業(yè)務邏輯創(chuàng)建有關Serial和Bigserial類型的表。

  • 問題2:在一個事務里刪除并重建帶有Serial的表時報錯。

    • 問題現(xiàn)象

      在一個事務里刪除并重建帶有Serial的表時,出現(xiàn)如下報錯提示。

      failed: error: duplicate key value violates unique constraint "hg_table_properties_pkey"
    • 問題原因

      不支持在一個事務里刪除并重建帶有Serial的表。

    • 解決方法

      刪除事務(BEGIN;COMMIT)。