2016-10-15 7 views
2

У меня есть несколько существующих таблиц, в которых мне нужно изменить различные столбцы, чтобы иметь значение по умолчанию.Установите значение столбца в значение по умолчанию

Как можно применить значение по умолчанию для старых записей, которые NULL, так что старые записи будут совместимы с новыми

ALTER TABLE "mytable" ALTER COLUMN "my_column" SET DEFAULT NOW(); 

После изменения таблицы выглядит примерно так ...

Table "public.mytable" 
Column  |   Type    |      Modifiers 
-------------+-----------------------------+----------------------------------------------- 
id   | integer      | not null default nextval('mytable_id_seq'::regclass) 
.... 

my_column | timestamp(0) with time zone | default now() 

Indexes: 
    "mytable_pkey" PRIMARY KEY, btree (id) 

Есть ли простой способ иметь все столбцы, которые в настоящее время являются нулевыми, а также которые имеют значение по умолчанию для значения по умолчанию?

ответ

2

Я просто попытался это, и это так же просто, как

update mytable 
set my_column = default 
where my_column is null 

См sqlfiddle

0

Редактировать:olaf Ответ - самый простой и правильный способ сделать это, однако нижеследующее также является жизнеспособным решением для большинства случаев.

Для каждого столбца это легко использовать information_schema и получить значение по умолчанию столбца, а затем использовать это в UPDATE заявления

UPDATE mytable set my_column = (
    SELECT column_default 
    FROM information_schema.columns 
    WHERE (table_schema, table_name, column_name) = ('public', 'mytable','my_column') 
)::timestamp 
WHERE my_column IS NULL; 

Примечания сусло подзапроса по напечатанному в соответствующую колонку тип данных .

Кроме того, это утверждение не будет оценивать выражения, как column_default будет иметь тип характера изменения он будет работать для NOW() но не для выражения, как говорят (NOW()+ interval ' 7 days')

Лучше получить выражение и проверить его затем применить его вручную