duckdb 1.6dev的新功能:触发器和variant 数据类型

下载最新预览版

复制代码
C:\d>wget https://artifacts.duckdb.org/latest/duckdb-binaries-linux-amd64.zip -O duckdb-binaries-linux-amd64-0627.zip


duckdb-binaries-linux-amd64-0 100%[=================================================>]  87.92M   813KB/s    in 2m 33s

2026-06-27 08:48:37 (590 KB/s) - 'duckdb-binaries-linux-amd64-0627.zip' saved [92187076/92187076]


C:\d>wsl
root@DESKTOP-59T6U68:/mnt/c/d# ./duckdb0626
DuckDB v1.6.0-dev9687 (Development Version, d9fdc2f20b)
Enter ".help" for usage hints.
memory D

root@DESKTOP-59T6U68:/mnt/c/d# exit
logout

下面用windows的同样版本测试,预览版缺少插件

复制代码
C:\d>duckdb0626
DuckDB v1.6.0-dev9687 (Development Version, d9fdc2f20b)
Enter ".help" for usage hints.
memory D install rusty_sheet from community;
HTTP Error:
Failed to download extension "rusty_sheet" at URL "http://community-extensions.duckdb.org/d9fdc2f20b/windows_amd64/rusty_sheet.duckdb_extension.gz" (HTTP 404)

Candidate extensions: "vss", "unity_catalog", "sqlite_scanner", "postgres_scanner", "sqlite"
For more info, visit https://duckdb.org/docs/current/extensions/troubleshooting?version=d9fdc2f20b&platform=windows_amd64&extension=rusty_sheet

https://blobs.duckdb.org/events/duckcon7/hannes-muehleisen-mark-raasveldt-duckcon7-state-of-the-duck.pdf 幻灯片中提到的两个功能

触发器,审计插入和删除

复制代码
memory D CREATE TABLE target (id INTEGER);
memory D CREATE TABLE audit (id INTEGER);
memory D CREATE TRIGGER t
         AFTER INSERT ON target
         FOR EACH ROW INSERT INTO audit VALUES (NEW.id);
memory D insert into target select 1;
memory D from audit;
┌───────┐
│  id   │
│ int32 │
├───────┤
│     1 │
└───────┘

memory D CREATE TRIGGER t1
         AFTER DELETE ON target
         FOR EACH ROW INSERT INTO audit VALUES (OLD.id);
memory D delete from target where id=1;
memory D from audit;
┌───────┐
│  id   │
│ int32 │
├───────┤
│     1 │
│     1 │
└───────┘         

variant 数据类型,可以插入任意其他类型的值,比如json、字符串、数值型。

复制代码
memory D CREATE TABLE variant_table (j VARIANT);
memory D INSERT INTO variant_table VALUES (JSON '{"hello":"world", "best_number": 42}');
memory D FROM variant_table;
┌─────────────────────────────────────┐
│                  j                  │
│               variant               │
├─────────────────────────────────────┤
│ {'hello': world, 'best_number': 42} │
└─────────────────────────────────────┘

memory D FROM variant_table select j::json;
┌────────────────────────────────────┐
│         CAST(j AS "json")          │
│                json                │
├────────────────────────────────────┤
│ {"hello":"world","best_number":42} │
└────────────────────────────────────┘
memory D
memory D INSERT INTO variant_table VALUES ('varchar');
memory D INSERT INTO variant_table VALUES (100);
memory D from variant_table;
┌─────────────────────────────────────┐
│                  j                  │
│               variant               │
├─────────────────────────────────────┤
│ {'hello': world, 'best_number': 42} │
│ varchar                             │
│ 100                                 │
└─────────────────────────────────────┘
memory D from variant_table select j where j=100;
┌─────────┐
│    j    │
│ variant │
├─────────┤
│ 100     │
└─────────┘
memory D from variant_table select j where j='varchar';
┌─────────┐
│    j    │
│ variant │
├─────────┤
│ varchar │
└─────────┘