我使用的数据类型包含字符(6)字段。我想将其更改为varchar(7)字段。不幸的是,我在使用PostgreSQL 8.3.8的服务器上,并且ALTER TYPE当时没有太多功能。此列也被多个函数使用,因此我不会删除该属性并使用正确的参数添加新列。
这就是我的意思:
mydb=# \d t_emp_start_stop_2
Composite type "public.t_emp_start_stop_2"
Column | Type
--------------+--------------
employee_id | character(6)
normal_start | integer
normal_stop | integer
normal_lunch | integer
我想将employee_id替换为varchar(7)字段。有没有办法干净利落地做到这一点?
答案 0 :(得分:0)
如果您可以改变类型名称,并且可以更改所有相关功能的类型,那么您可能会转而使用新类型。
-- create a new type
CREATE TYPE public.t_emp_start_stop_2_new AS (
employee_id VARCHAR(7),
normal_start INTEGER,
normal_stop INTEGER,
normal_lunch INTEGER
);
-- create a function that takes the old type and outputs the new type
CREATE OR REPLACE FUNCTION t_emp_start_stop_2_new_converter(value1 t_emp_start_stop_2)
RETURNS t_emp_start_stop_2_new AS $$
DECLARE
newtype t_emp_start_stop_2_new;
BEGIN
newtype.employee_id = value1.employee_id;
newtype.normal_start = value1.normal_start;
newtype.normal_stop = value1.normal_stop;
newtype.normal_lunch = value1.normal_lunch;
return newtype;
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT;
-- create a cast from the old to new type
CREATE CAST (t_emp_start_stop_2 AS t_emp_start_stop_2_new)
WITH FUNCTION t_emp_start_stop_2_new_converter(t_emp_start_stop_2);
-- update table to use new type
ALTER TABLE abc
ALTER xyz TYPE t_emp_start_stop_2_new
USING xyz::t_emp_start_stop_2_new;
-- UPDATE ALL EXISTING FUNCTIONS TO USE NEW TYPE HERE
-- drop old cast, function and type
DROP CAST (t_emp_start_stop_2 AS t_emp_start_stop_2_new);
DROP FUNCTION t_emp_start_stop_2_new_converter(t_emp_start_stop_2);
DROP TYPE t_emp_start_stop_2;