2

postgre で列のデータ型を「文字可変」から「bigint」に変更します。

古い列には文字列 "male" と "female" が含まれていますが、今はそれぞれ男性または女性を表す 0 または 1 に変更したいと考えています。

単純な Alter table だと思います... Alter Column は、男性 -> 0、女性 -> 1 の変換を行わないため、この問題は解決しません。

これを行うための最も安全な方法を誰かに教えてもらえますか?

どうもありがとう。

4

4 に答える 4

4

考慮すべき点

  1. 男性に 1 を使用し、女性に 0 を使用する場合、なぜ bigint データ型を使用するのですか? BIT/TINYINT データ型が機能します
  2. 列のデータ型を変更する前に、男性を 1 に、女性を 0 に更新する必要があります。
于 2013-01-17T10:43:11.223 に答える
2

皆さんはこれを回避するために長い道のりを歩んでいます。これが短いテストケースです:

 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)
于 2013-01-18T07:52:34.250 に答える
1

ALTER COLUMNPostgres には、 @ScottMarlowe によると、より単純な でマッピングを提供する機能があることに注意してください。

ほとんどの RDBMS では、これは次のようにして行うこともできます。

  1. 性別の整数分類を含む新しい一時列を作成します
  2. CASE / WHEN を使用してテーブルを更新し、古い varchar を新しい INT にマップします。
  3. 古い varchar 列をドロップします
  4. 古い列をテーブルに追加し直します。今回は新しいデータ型を使用します
  5. データを一時 BIGINT 列から新しい列にコピーして戻します
  6. 一時 BIGINT 列を削除します

無効なマッピングも処理する必要があるかもしれません - 私はケース ELSE でこれを行いました。@Madhivananが示唆するようBIGINTに、性別分類に a を使用すると、完全にやり過ぎに聞こえます。

ここでSQLフィドル

-- 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;
于 2013-01-17T10:50:03.890 に答える
0

最初にテーブルを更新し、男性を 0 に、女性を 1 に変更する必要があります。

その後、テーブルを変更できます...列の変更

于 2013-01-17T10:46:13.767 に答える