Можно ли определить столбец временной метки, который не является нулевым, и не имеет значения по умолчанию и никакого специального поведения при обновлении?
Когда я создаю таблицу с столбцом отметки времени, этот столбец магически определяется как NOT NULL DEFAULT CURRENT_TIMESTAMP при обновлении CURRENT_TIMESTAMP. Игнорируя, насколько странно это до сих пор, я хотел бы изменить его, чтобы не иметь никаких настроек по умолчанию и никаких специальных действий по обновлению.
Я обнаружил, что если я изменил столбец равным NULL, по умолчанию магически установлено значение NULL, а "on update" волшебным образом исчезнет. Это здорово, однако я бы хотел, чтобы столбец был NOT NULL. Когда я меняю его обратно, как по умолчанию, так и "on update" (устанавливается на CURRENT_TIMESTAMP) волшебным образом появляются снова.
Я знаю, что могу использовать datetime вместо timestamp, но меня интересует временная метка, потому что она зависит от часовой пояс (похоже, это временная метка с часовым поясом в Postgres).
Ответы
Ответ 1
Столбец Timestamp - это особый случай. См. здесь: по умолчанию столбцы TIMESTAMP не являются NULL, не могут содержать значения NULL, а назначение NULL присваивает текущую временную метку.
Для получения более подробной информации прочтите Значения по умолчанию для типа данных.
В частности, эта ситуация применяется, если она не работает в строгом режиме. Если вы работаете в строгом режиме, вставка NULL вызовет ошибку.
Это должно позаботиться об этом:
ALTER TABLE tableName ALTER COLUMN columnName DROP DEFAULT;
Если это не сработает, то это должно оставить вас по умолчанию (легко перезаписать), но удалить ON UPDATE:
ALTER TABLE tableName CHANGE columnName columnName NOT NULL DEFAULT CURRENT_TIMESTAMP;
Обратите внимание на имя повторного столбца.
Ответ 2
Недавно я нашел действительно хорошее решение, которое может вам помочь.
Отключить ON UPDATE