Соединение Laravel с MySQL в строгом режиме

Мой ответ связан с Laravel

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

введите сюда описание изображения

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

Это схема таблицы

create table if not exists ads_sliders
(
    id bigint unsigned auto_increment
        primary key,
    name varchar(191) not null,
    image varchar(191) not null,
    appearance_time int default 0 null,
    active tinyint(1) default 1 not null,
    `default` tinyint(1) default 0 null,
    first_period_sort int default 99 null,
    second_period_sort int default 99 null,
    third_period_sort int default 99 null,
    internal_link varchar(191) null,
    external_link varchar(191) null,
    deleted tinyint(1) default 0 not null,
    country_id char(36) not null,
    created_at timestamp null,
    updated_at timestamp null,
    start_date date not null,
    end_date date not null,
    ad_appears smallint default 1 null,
    display_period int unsigned not null,
    repetition int unsigned not null,
    display_place tinyint not null,
    on_click_action tinyint not null,
    data json null,
    constraint ads_sliders_country_id_foreign
        foreign key (country_id) references countries (id)
            on delete cascade
)
collate=utf8mb4_unicode_ci;

Это оператор вставки

    insert into
  `ads_sliders` (
    `name`,
    `image`,
    `country_id`,
    `end_date`,
    `updated_at`,
    `created_at`
  )
values
  (
    'sadf',
    'assets/images/ads_sliders/cLZVRNXf0LAP4j3IsdLImZejouAEri0grvEJxB0S.png',
    '55af3f40-23e3-11e9-acdc-efd87e16b684',
    '2024-04-30',
    '2024-04-30 09:16:07',
    '2024-04-30 09:16:07'
  )

Я дважды проверил, что эти столбцы не равны нулю и не имеют значения по умолчанию. и я убедился, что значение глобальной переменной sql_mode установлено по умолчанию, то есть ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_ENGINE_SUBSTITUTION. Версия MySQL — 8.0.

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

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

Bagus Tesa 30.04.2024 13:57

это верно, но как MySQL принимает вставку этих строк без исключения @BagusTesa

abdul rahman souda 30.04.2024 14:00

Вы не сказали, как вставляете. Учитывая изображение, похоже, что вы вставляете данные из CSV. Как эти столбцы выглядят в CSV?

Jon Waterhouse 30.04.2024 14:01

Включите схему таблицы и оператор вставки.

Rogue 30.04.2024 14:02

Я добавил схему таблицы и оператор вставки @Rogue

abdul rahman souda 30.04.2024 14:14

@JonWaterhouse Это просто оператор вставки. Я использовал обычный ORM для вставки строк, а не для выдачи CSV.

abdul rahman souda 30.04.2024 14:15

Код, которым вы поделились, не похож на PHP или Laravel — удалите эти теги или поделитесь кодом, который вы действительно используете.

Nico Haase 30.04.2024 15:28

Я добавляю жирным шрифтом, что мой ответ связан с проектом laravel @NicoHaase. Спасибо

abdul rahman souda 30.04.2024 15:30

Вы до сих пор не рассказали, какое отношение ваш вопрос имеет к Laravel. Также ответы следует размещать в разделе ответов.

Nico Haase 30.04.2024 16:00
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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 и хотите разрабатывать...
0
9
107
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В MySQL, если вы попытаетесь вставить строку в таблицу без указания значения для каждого столбца, база данных обработает это одним из следующих способов:

  1. Значения по умолчанию: Если для столбца определено значение по умолчанию, MySQL будет использовать это значение для столбца, если во время операции вставки значение не указано.
  2. Столбцы, допускающие значение NULL: если столбец допускает значения NULL и во время операции вставки значение не указано, MySQL вставит NULL в этот столбец.
  3. Неявное преобразование: MySQL также может выполнять неявное преобразование типов данных, если вставляемое значение может быть преобразовано в соответствующий тип данных для столбца.
  4. Строгий режим SQL. Если для режима SQL установлено строгое значение, MySQL выдаст ошибку, если вы попытаетесь вставить строку с отсутствующими значениями для столбцов, которые не допускают NULL и не имеют значения по умолчанию.

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

Не разрешать значение, допускающее значение NULL, и не объявлять значение по умолчанию — не очень распространенная практика. Их определение зависит от конкретных требований вашего приложения и характера данных, с которыми вы имеете дело. Но я рекомендую объявить значение по умолчанию, если вы не допускаете значение null, а также не передаете значение при вставке.

подробнее здесь: Неявная обработка по умолчанию. «Если спецификация типа данных не включает явного значения DEFAULT, MySQL определяет значение по умолчанию следующим образом: ....»

Luuk 30.04.2024 14:08

Я добавил схему таблицы и оператор вставки, вы можете это увидеть. и я проверил режим sql. вот почему это меня смущает. Я хочу понять причину.

abdul rahman souda 30.04.2024 14:21

@abdulrahmansouda, можешь выполнить следующий запрос: ALTER TABLE ads_sliders MODIFY COLUMN start_date DATE NOT NULL; и попробовать еще раз? Если вы не разрешаете NULL и не указываете значение в инструкции INSERT, MySQL должен выдать ошибку.

Jeremy 30.04.2024 14:46

Я нашел решение! Большое спасибо. это проблема с работой фреймворка laravel. @Джереми

abdul rahman souda 30.04.2024 15:32
Ответ принят как подходящий

Мне жаль, что это проблема Laravel. Я тестировал его во время выполнения запроса. введите сюда описание изображения

во время выполнения запроса где-то переменная sql_mode изменилась на этапе сеанса.

Если вы зайдете в файл конфигурации Database.php внутри соединения MySQL, вы увидите, что существует строгий режим.

Если выключите его. Всякий раз, когда laravel устанавливает какое-либо соединение с базой данных, он меняет sql_mode на NO_ENGINE_SUBSTITUTION. в этом случае любое пропущенное значение из инертного оператора будет игнорироваться.

Это не ответ на ваш вопрос. Если вы считаете, что это новая информация для вашего вопроса, используйте изменить, чтобы добавить ее в вопрос.

Luuk 30.04.2024 15:11

да, извините, я знаю и перепишу ответ. @Луук

abdul rahman souda 30.04.2024 15:21

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