Вот выдержка из официального документа Redshift документов для обработки столбца со значением по умолчанию.
Если столбец в таблице отсутствует в списке столбцов, COPY загрузит столбецлибо со значением, предоставленным параметром DEFAULT, который был указан в команде CREATE TABLE, либо с NULL, если параметр DEFAULT не был указан.
Так что, если вы пропустите из списка столбцов, он всегда будет сохраненDEFAULT
.И значения по умолчанию оцениваются только один раз, то есть все строки будут иметь одинаковое значение.
Я считаю, что это не должен быть ваш случай , единственным возможным виновником может быть ваш json 'auto'
, который может бытьнепреднамеренно заставляя Redshift
ignore created_at
.
Затем, если вы укажете столбец DEFAULT, он всегда загружает его из файла данных, поэтому, если вы этого не сделаете, он будет рассматривать его как null
и загрузить как null
.Не применяется логика DEFAULT
.Например, если ваши данные имеют вид -
{"foo":"bar", "created_at":"2018-09-05 17:48:34"}
{"foo":"bar1","created_at":""}
{"foo":"bar2"}
{"foo":"bar3","created_at":null}
Они будут заполнены в базе данных, как показано ниже.
foo | created_at
------+---------------------
bar2 |
bar | 2018-09-05 17:48:34
bar1 |
bar1 |
(4 rows)
ТАК, какие варианты у вас есть, чтобы справиться с этой ситуацией?
Перейдите ко второму варианту, где вы указываете столбец со значениями по умолчанию и выдает запрос update
сразу после загрузки ваших данных.например,
update foo set created_at= sysdate where created_at is null;
Пожалуйста, имейте в виду, , UPDATEs
являются дорогостоящими операциями в Redshift
как его DELETE+INSERT
.Тогда что еще, если возможно, преобразуйте ваши данные в источнике, если это не дорого, или сделайте сравнение, где заполнение DEFAULT подходит лучше всего в вашем случае.
Я надеюсь, что это поможет, если нет, дайте мне знать через комментарийЯ перефокусирую ответ.