我有一个看起来像这样的表:
CREATE TABLE "TestResults" (
"Id" text PRIMARY KEY,
"Name" text NOT NULL UNIQUE,
"Result" text CHECK ("Comment" IN ('Pass', 'Fail')),
"CreatedBy" text NOT NULL,
"CreatedOn" timestamp with time zone NOT NULL,
);
我们正在使用PostgreSQL 9.4
用户当前可以从下拉菜单中选择Pass
或Fail
,我们已将这些字符串存储在Result
列的数据库中。我们想将其更改为布尔值。
如何在保留用户已输入的值的同时,将Result
列从文本更改为布尔值?
谢谢。
答案 0 :(得分:2)
每当您想要更改列的类型但没有从旧值到新值的默认转换时,您希望使用USING clause指定如何将旧值转换为新值:
可选的
USING
子句指定如何从旧的计算新列值;如果省略,则默认转换与从旧数据类型转换为new的赋值相同。如果没有从旧类型到新类型的隐式或赋值转换,则必须提供USING
子句。
首先摆脱CHECK约束,你可以通过\d "TestResults"
中的psql
找到该名称,但它可能是"TestResults_Result_check"
:
alter table "TestResults" drop constraint "TestResults_Result_check";
然后使用ALTER COLUMN(带有USING子句)来更改类型:
alter table "TestResults"
alter column "Result"
set data type boolean
using case
when "Result" = 'Pass' then true
when "Result" = 'Fail' then false
else null
end;