31 lines
1.1 KiB
TypeScript
31 lines
1.1 KiB
TypeScript
import { db } from '~/drizzle/db'
|
|
import { sql } from 'drizzle-orm'
|
|
|
|
// 恢复显式 id 数据后同步所有自增序列,避免后续插入主键冲突(幂等)
|
|
export async function syncAllSequences(): Promise<void> {
|
|
await db.execute(sql`
|
|
DO $repair$
|
|
DECLARE
|
|
r record;
|
|
seqname text;
|
|
maxid bigint;
|
|
BEGIN
|
|
FOR r IN
|
|
SELECT c.relname AS tbl, a.attname AS col
|
|
FROM pg_class c
|
|
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
JOIN pg_attribute a ON a.attrelid = c.oid
|
|
JOIN pg_attrdef ad ON ad.adrelid = a.attrelid AND ad.adnum = a.attnum
|
|
WHERE n.nspname = 'public' AND c.relkind = 'r'
|
|
AND a.attnum > 0 AND NOT a.attisdropped
|
|
AND pg_get_expr(ad.adbin, ad.adrelid) LIKE 'nextval(%'
|
|
LOOP
|
|
seqname := pg_get_serial_sequence(quote_ident(r.tbl), r.col);
|
|
IF seqname IS NULL THEN CONTINUE; END IF;
|
|
EXECUTE format('SELECT COALESCE(MAX(%I),0) FROM %I', r.col, r.tbl) INTO maxid;
|
|
EXECUTE format('SELECT setval(%L, %s)', seqname, GREATEST(maxid, 1));
|
|
END LOOP;
|
|
END $repair$
|
|
`)
|
|
}
|