为Duckdb已有表添加唯一列(键)

众所周知,表的唯一键在查询和维护数据时非常重要,但有些表并不一定存在唯一键。 在其他数据库中为已有表新增唯一键是件很简单的事情,那就是update和row_number函数结合使用即可。 但是duckdb不支持二者结合使用。所有才有此文章。

原有表结构:

1
2
3
4
5
old_table (
	项目编号 VARCHAR,
	项目名称 VARCHAR,
	客户姓名 VARCHAR,
)

## 第一步 新建表,新表的结构在原表的基础上新增唯一键uid列, sql~~ ~~CREATE TABLE new_table (~~ ~~ uid INTEGER PRIMARY KEY,~~ ~~ 项目编号 VARCHAR,~~ ~~ 项目名称 VARCHAR,~~ ~~ 客户姓名 VARCHAR,~~ ~~);~~ ~~ ## 第二步 然后将使用insert to 和row_number函数结合的方式来进行数据转移。 数据量大的时候,非常慢。

利用的是sequence(官方sequence文档

1
2
CREATE SEQUENCE serial;
ALTER TABLE tbl ADD COLUMN id INTEGER DEFAULT nextval('serial');
1
2
3
4
5
6
7
8
9
CREATE SEQUENCE id_sequence;
CREATE TABLE tbl (id INTEGER DEFAULT nextval('id_sequence') PRIMARY KEY,
				  s VARCHAR);
INSERT INTO tbl (s) VALUES ('hello'), ('world');
SELECT * FROM tbl;
--将输出:
id	s
1	hello
2	world

更多duckdb使用技巧:https://duckdbsnippets.com/

1
SELECT COLUMNS('^dim_') FROM fact_table;
1
SELECT * EXCLUDE (id) FROM tba;