postgre で列のデータ型を「文字可変」から「bigint」に変更します。
古い列には文字列 "male" と "female" が含まれていますが、今はそれぞれ男性または女性を表す 0 または 1 に変更したいと考えています。
単純な Alter table だと思います... Alter Column は、男性 -> 0、女性 -> 1 の変換を行わないため、この問題は解決しません。
これを行うための最も安全な方法を誰かに教えてもらえますか?
どうもありがとう。
postgre で列のデータ型を「文字可変」から「bigint」に変更します。
古い列には文字列 "male" と "female" が含まれていますが、今はそれぞれ男性または女性を表す 0 または 1 に変更したいと考えています。
単純な Alter table だと思います... Alter Column は、男性 -> 0、女性 -> 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)
ALTER COLUMN
Postgres には、 @ScottMarlowe によると、より単純な でマッピングを提供する機能があることに注意してください。
ほとんどの RDBMS では、これは次のようにして行うこともできます。
無効なマッピングも処理する必要があるかもしれません - 私はケース ELSE でこれを行いました。@Madhivananが示唆するようBIGINT
に、性別分類に a を使用すると、完全にやり過ぎに聞こえます。
-- 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;
最初にテーブルを更新し、男性を 0 に、女性を 1 に変更する必要があります。
その後、テーブルを変更できます...列の変更