将 BIGSERIAL 列添加到大表(约 3 Bil. 行,约 174Gb)的最快方法是什么?
编辑:
NOT NULL
) 的递增值。所以我目前正在创建一些 SQL 来读取 postgres (9.1) 目录以构建表定义。但是,我遇到了 SERIAL/BIGSERIAL 数据类型的问题。
例子:
CREATE TABLE cruft.temp ( id BIGSERIAL PRIMARY KEY );
SELECT * FROM information_schema.columns WHERE table_schema='cruft' AND table_name='temp';
"db","cruft","temp","id",1,"nextval('cruft.temp_id_seq'::regclass)","NO","bigint",,,64,2,0,,,,,,,,,,,,,"db","pg_catalog","int8",,,,,"1","NO","NO",,,,,,,"NEVER",,"YES"
Run Code Online (Sandbox Code Playgroud)
它给了我数据库名 (db)、模式名 (cruft)、表名 (temp)、列名 (id)、默认值 (nextval( ... )) 和数据类型(bigint 和 int8 .. NOT bigserial) ...我意识到我可以检查默认值是否是一个序列 - 但我不相信这会是 100% 准确的,因为我可以手动创建一个序列并创建一个非序列列,其中默认值是那个顺序。
有没有人对我如何实现这一点有建议?除了检查 nextval(*_seq) 的默认值之外还有什么别的方法吗?
针对 TL;DR 或不熟悉 pg_catalog 的新用户在此处添加的 SQL 解决方案进行了编辑:
with sequences as (
select oid, relname as sequencename from pg_class where relkind = 'S'
) select
sch.nspname as schemaname, tab.relname as tablename, col.attname …
Run Code Online (Sandbox Code Playgroud) 如何使用字符串和DECLARE
变量的组合动态引用序列名称(如下所示)?下面的代码是否正确或者是否有其他方法可以做到这一点?
DO
我的目标是出于性能原因在/块中执行此操作BEGIN
,而且它将通过做一些有用的事情来帮助我理解 plpgsql,因此除非确实必须,否则我不会将其混合到 PHP 中。
DO $$
DECLARE PKEY VARCHAR;
BEGIN
SELECT pg_attribute.attname INTO PKEY
FROM pg_index, pg_class, pg_attribute
WHERE pg_class.oid = 'parts1'::regclass
AND indrelid = pg_class.oid
AND pg_attribute.attrelid = pg_class.oid
AND pg_attribute.attnum = any(pg_index.indkey)
AND indisprimary;
--SELECT setval('parts1_id_seq', (SELECT MAX(pkey) + 1 FROM parts));
SELECT setval('parts1_' || PKEY || '_seq', (SELECT MAX(pkey) + 1 FROM parts));
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)