Postgresql Boolean Bir Sütunu Integer Tipine Cast Etmek

Postgresql bir tabloda bazen tip değişikliği yapmak istediğizde size anlamsız gelen bir hata alabilirsiniz. Örneğin tipi boolean olan bir sütunu true ve false yerine 1 ve 0 smallint tipine cast etmek istediğinizde ALTER TABLE satırınızdaki USING ifadeniz ( USING CASE WHEN "IsActive"=true THEN 1 ELSE 0 END; )  doğru olmasına rağmen aşağıdaki hatayı alırsınız.

ERROR: default for column "IsActive" cannot be cast automatically to type smallint SQL state: 42804

Esasen bu hata tip uyumsuzluğundan değil boolean kolonun tamamen SET DEFAULT değerinin true yada false olarak SET edilmesinden kaynaklanmaktadır. Aşağıdaki örnekte olduğu gibi öncelikle ilgili kolonu NULL olacak şekilde set ederek sorunu aşabilirsiniz.

 

ALTER TABLE  "mySCHEMA"."myTable" ALTER "IsActive" SET DEFAULT NULL;
ALTER TABLE "mySCHEMA"."myTable" ALTER COLUMN "IsActive" TYPE smallint USING CASE WHEN "IsActive"=true THEN 1 ELSE 0 END;