我将在postgre中将列的数据类型从“character varying”更改为“bigint”。
旧列包含字符串“male”和“female”,现在我想将其更改为0或1,每个代表男性或女性。
我认为一个简单的Alter表... Alter Column没有解决这个问题,因为它不会做男性 - > 0,女性 - > 1转换。
有谁能让我知道最安全的方法是什么?
非常感谢。
答案 0 :(得分:4)
要考虑的要点
答案 1 :(得分:1)
请注意,根据@ScottMarlowe,Postgres能够使用ALTER COLUMN
提供更简单的映射。
在大多数RDBMS中,这也可以按如下方式完成:
您可能还需要处理无效映射 - 我已经使用案例ELSE完成了此操作。
正如@Madhivanan所建议的那样,使用BIGINT
进行性别分类听起来有点过分。
-- Add new Column
ALTER TABLE SomeTable ADD GenderTypeId BIGINT;
-- Map old to new
UPDATE SomeTable SET GenderTypeId =
CASE
WHEN GenderVarchar = 'male'
THEN 0
WHEN GenderVarchar = 'female'
THEN 1
ELSE
-1 -- Invalid source data
END;
-- Drop old
ALTER TABLE SomeTable DROP COLUMN GenderVarchar;
<强>更新强>
如果您需要使用与原始列相同的列名,则还需要将旧列添加回来,这次使用新数据类型,然后再次复制数据。 (我给它一个新名字)
ALTER TABLE SomeTable ADD Gender BIGINT;
-- Copy the data across
UPDATE SomeTable SET Gender = GenderTypeId;
-- Drop the temporary column
ALTER TABLE SomeTable DROP COLUMN GenderTypeId;
答案 2 :(得分:1)
你们都在为此做出很长的努力。这是一个简短的测试用例:
create table test (username text, sex text);
insert into test values ('bob','male'),('sandra','female'),('stan','male'),('sue','male');
select * from test;
username | sex
----------+--------
bob | male
sandra | female
stan | male
sue | male
(4 rows)
alter table test alter column sex type int using case when sex='male' then 0 when sex='female' then 1 end;
select * from test;
username | sex
----------+-----
bob | 0
sandra | 1
stan | 0
sue | 0 (4 rows)
答案 3 :(得分:0)
您必须先更新表格并将男性更改为0,将女性更改为1
然后你可以改变表...改变列