改变PostgreSQL 8.3.8中的类型

时间:2014-05-20 17:13:15

标签: postgresql types

我使用的数据类型包含字符(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)字段。有没有办法干净利落地做到这一点?

1 个答案:

答案 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;