postgresql - 如何在postgres中增加重复的ID
问题描述
我有一个需要 id 唯一的表,我的表中的 id 列具有类似 sourcename_number 的值
id
noaa_1
noaa_2
noaa_3
noaa_3
noaa_3
meteo_1
meteo_2
meteo_2
我想把它改成
noaa_1
noaa_2
noaa_3
noaa_4
noaa_5
meteo_1
meteo_2
meteo_3
使列中没有重复
解决方案
- 您需要一个正则表达式来匹配
-
- 你需要在字符串类
row_number()
中枚举 - 您需要一个标识列来排序(这可能是
ctid
系统列) - 您需要一个自连接子查询来引用
row_number()
\i tmp.sql
CREATE TABLE ugly_duck
( id_name text
);
INSERT INTO ugly_duck(id_name) VALUES
( 'noaa_1' ) , ( 'noaa_2' ) , ( 'noaa_3' ) , ( 'noaa_3' ) , ( 'noaa_3' )
, ( 'meteo_1' ) , ( 'meteo_2' ) , ( 'meteo_2' )
;
SELECT * FROM ugly_duck;
-- create a surrogate unique key
ALTER TABLE ugly_duck ADD COLUMN seq serial UNIQUE;
UPDATE ugly_duck dst
SET id_name = src.prefix || src.rn::integer
FROM ( SELECT seq
, substring( id_name FROM '.*_') AS prefix
, row_number() OVER (PARTITION BY substring( id_name FROM '.*_') ORDER BY seq) rn
FROM ugly_duck
) src
WHERE src.seq=dst.seq
;
SELECT * FROM ugly_duck;
-- remove the surrogate key
ALTER TABLE ugly_duck DROP COLUMN seq;
-- create the natural key
ALTER TABLE ugly_duck ADD PRIMARY KEY (id_name);
SELECT * FROM ugly_duck;
\d+ ugly_duck
输出:
DROP SCHEMA
CREATE SCHEMA
SET
CREATE TABLE
INSERT 0 8
id_name
---------
noaa_1
noaa_2
noaa_3
noaa_3
noaa_3
meteo_1
meteo_2
meteo_2
(8 rows)
ALTER TABLE
UPDATE 8
id_name | seq
---------+-----
meteo_1 | 6
meteo_2 | 7
meteo_3 | 8
noaa_1 | 1
noaa_2 | 2
noaa_3 | 3
noaa_4 | 4
noaa_5 | 5
(8 rows)
ALTER TABLE
ALTER TABLE
id_name
---------
meteo_1
meteo_2
meteo_3
noaa_1
noaa_2
noaa_3
noaa_4
noaa_5
(8 rows)
Table "tmp.ugly_duck"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
---------+------+-----------+----------+---------+----------+--------------+-------------
id_name | text | | not null | | extended | |
Indexes:
"ugly_duck_pkey" PRIMARY KEY, btree (id_name)
推荐阅读
- mysql - 如何连接三个表,从两个表中添加两个单独的字段,然后最后按两个表中的两个单独字段分组
- r - tidyverse 中所有可能的配对
- eclipse - 如何预先显示 TestNG 的所有测试用例以选择一些执行 - 测试资源管理器?
- arrays - Kotlin:类型推断失败:没有足够的信息来推断 fun 中的参数 E
(): kotlin.collections.ArrayList - sql - 将 org src dbpassword 标头隐藏到其他位置
- javascript - react native(android)中.jar文件的访问方法
- sql - 如何从csv文件的列字段值中删除双引号,即复制到postgreSQL中的表
- php - HTML 到 Word (DOC/DOCX) 库
- java - iText 7中的afterSplitTable事件
- ansible - Ansible 嵌套循环和条件一起在同一个任务中