【发布时间】:2014-05-07 18:48:44
【问题描述】:
我正在制作一个函数,它将一个 id 列添加到给定的表中,创建一个序列并填充新的列值。问题是该列已创建,但现在我需要用创建的序列(1、2、3、4、5 ...)的nextval() 填充它。我不知道如何在添加列语句中指定。
CREATE OR REPLACE FUNCTION create_id(tabla character varying)
RETURNS void AS
$BODY$
DECLARE
BEGIN
IF NOT EXISTS (SELECT information_schema.columns.column_name FROM information_schema.columns WHERE information_schema.columns.table_name=tabla AND information_schema.columns.column_name='id')
THEN
EXECUTE 'ALTER TABLE '|| tabla ||' ADD COLUMN id numeric(8,0)';
IF NOT EXISTS (SELECT relname FROM pg_class WHERE relname='seq_id_'||tabla)
THEN
EXECUTE 'CREATE SEQUENCE seq_id_'||tabla||' INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1 CACHE 1';
EXECUTE 'GRANT ALL ON TABLE seq_id_'||tabla||' TO postgres';
EXECUTE 'ALTER TABLE ONLY '||tabla||' ALTER COLUMN id SET DEFAULT nextval(''seq_id_'||tabla||'''::regclass)';
END IF;
END IF;
RETURN;
END;
$BODY$
LANGUAGE plpgsql;
【问题讨论】:
-
您需要更新新的
id列,用nextval 填充?按什么标准排序? -
无条件排序,第一个记录第一个值,第二个记录第二个值,第三个记录第三个值..
-
如果没有排序标准,则没有“第一”和“第二”字...无序选择可能会以它更喜欢的任何顺序返回值。
-
如果您根本不关心订单,只需添加
execute 'update ' || tabla || ' set id = nextval(''seq_id_'||tabla||'')'; -
是的,谢谢,成功了
标签: postgresql auto-increment plpgsql alter-table column-defaults