Красноречивый: недопустимое значение по умолчанию с отметками времени

Вот моя схема миграции:

public function up()
{
    Schema::create('objects', function (Blueprint $table) {
        $table->increments('id');
        $table->timestamp('timestamp1');
        $table->timestamp('timestamp2');
    });
}

Но когда я запускаю php artisan migrate, я получаю такую ​​ошибку:

Illuminate\Database\QueryException : SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for 'timestamp2' (SQL: create table objects (id int unsigned not null auto_increment primary key, timestamp1 timestamp not null, timestamp2 timestamp not null) default character set utf8mb4 collate utf8mb4_unicode_ci)

Я должен указать, что когда я удаляю одну из двух строк $table->timestamp(...);, она работает, но не работает, когда есть обе. А модель Object.php пуста как может быть. Я сделал ошибку?

Я прочитал эта почта, но, хотя при замене timestamp(...) на dateTime(...) ошибок больше нет, мне нужны только временные метки.

Оператор создания отлично работает для меня. Какую версию mysql вы используете?

aynber 03.05.2018 15:46

В таблице будет только один столбец с меткой времени, поэтому сделайте СИМВОЛ обновлением типа данных столбца.

Bibhudatta Sahoo 03.05.2018 15:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
5
2
3 869
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я нашел решение это на ларакастах:

nullableTimestamps() предназначены только для полей по умолчанию created_at, updated_at. для настраиваемых полей используйте timestamp()->nullable();

Но что, если я не хочу, чтобы эти временные метки допускали значение NULL? Если я хочу, чтобы они были установлены, например, на CURRENT_TIMESTAMP.

JacopoStanchi 03.05.2018 16:04

Вы можете использовать один в качестве текущего, но я не понимаю, зачем вам использовать два в качестве текущих.

Bálint Budavölgyi 03.05.2018 17:22

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

JacopoStanchi 03.05.2018 17:25

Самое первое ненулевое поле будет настроено на использование CURRENT_TIMESTAMP по умолчанию. Я полагаю, что все должно иметь значение по умолчанию, если не допускает значения NULL.

Bálint Budavölgyi 03.05.2018 17:29

Я опубликовал новый ответ, потому что не знал, будет ли у вас все в порядке, если я отредактирую ваш ответ, поскольку могут быть ошибки.

JacopoStanchi 03.05.2018 17:52

Проблема может возникнуть, если ваша схема БД не на английском, а, скажем, на испанском ... с точки зрения согласованности вы хотели бы, чтобы все столбцы были на одном языке, поэтому, если вы хотите иметь столбец с именем: 'creado' вместо 'created_at', laravel позволяет определить это в модели, но, как мы также видим, файл миграции не распознает это ... У меня та же проблема, я пытаюсь использовать последовательно испанские имена столбцов, но эта проблема с датой заставляет меня сомневаться, нужно ли вернуть все созданные / одифицированные столбцы на английский, просто чтобы не было проблем с этой проблемой с нулевым значением ()

Canelo Digital 16.07.2019 03:39

Вы можете сделать одну из двух меток времени нулевой, используя

timestamp()->nullable();

используя ваш пример, вы должны использовать:

$table->timestamp('timestamp2')->nullable();

Также laravel встроил временные метки с помощью

$table->timestamps();

который будет автоматически обрабатывать метки времени updated_at и created_at для вас

Я знаю, что для timestamps() я просто хотел упростить свой пример.

JacopoStanchi 03.05.2018 15:59
Ответ принят как подходящий

Метки времени немного особенные, они должны либо допускать значение NULL, либо иметь значение по умолчанию. Таким образом, вы должны выбрать между timestamp('timestamp1')->nullable(); или timestamp('timestamp1')->useCurrent() или пользовательским значением по умолчанию, например timestamp('timestamp1')->default(DB::raw('2018-01-01 15:23')).

Я думаю, что все типы данных должны иметь значение NULL или значение по умолчанию.

Bálint Budavölgyi 03.05.2018 17:56

Это неправда, например, VARCHAR и INT могут быть не обнуляемыми и не иметь значения по умолчанию. Вам просто нужно заполнить значение во время вставки.

JacopoStanchi 04.05.2018 09:09

WTF Mysql !? Почему мы не можем просто потребовать, чтобы метка времени была установлена ​​для вставки, как и для любого другого столбца? Какая головная боль.

Daniel Howard 10.06.2021 09:51

Другие вопросы по теме