Мой ответ связан с 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.
Я тестирую это в новой схеме базы данных. и он работает правильно. введите сюда описание изображения
это верно, но как MySQL принимает вставку этих строк без исключения @BagusTesa
Вы не сказали, как вставляете. Учитывая изображение, похоже, что вы вставляете данные из CSV. Как эти столбцы выглядят в CSV?
Включите схему таблицы и оператор вставки.
Я добавил схему таблицы и оператор вставки @Rogue
@JonWaterhouse Это просто оператор вставки. Я использовал обычный ORM для вставки строк, а не для выдачи CSV.
Код, которым вы поделились, не похож на PHP или Laravel — удалите эти теги или поделитесь кодом, который вы действительно используете.
Я добавляю жирным шрифтом, что мой ответ связан с проектом laravel @NicoHaase. Спасибо
Вы до сих пор не рассказали, какое отношение ваш вопрос имеет к Laravel. Также ответы следует размещать в разделе ответов.
В MySQL, если вы попытаетесь вставить строку в таблицу без указания значения для каждого столбца, база данных обработает это одним из следующих способов:
Итак, если вы видите, что записи вставляются без явного указания значений для всех столбцов, это, вероятно, связано с одной из этих причин. Вы можете проверить определения столбцов в схеме таблицы, чтобы узнать, определены ли значения по умолчанию или столбцы допускают значения NULL. Кроме того, вы можете проверить режим SQL, чтобы узнать, установлен ли он как строгий или нет.
Не разрешать значение, допускающее значение NULL, и не объявлять значение по умолчанию — не очень распространенная практика. Их определение зависит от конкретных требований вашего приложения и характера данных, с которыми вы имеете дело. Но я рекомендую объявить значение по умолчанию, если вы не допускаете значение null, а также не передаете значение при вставке.
подробнее здесь: Неявная обработка по умолчанию. «Если спецификация типа данных не включает явного значения DEFAULT, MySQL определяет значение по умолчанию следующим образом: ....»
Я добавил схему таблицы и оператор вставки, вы можете это увидеть. и я проверил режим sql. вот почему это меня смущает. Я хочу понять причину.
@abdulrahmansouda, можешь выполнить следующий запрос: ALTER TABLE ads_sliders MODIFY COLUMN start_date DATE NOT NULL;
и попробовать еще раз? Если вы не разрешаете NULL и не указываете значение в инструкции INSERT, MySQL должен выдать ошибку.
Я нашел решение! Большое спасибо. это проблема с работой фреймворка laravel. @Джереми
Мне жаль, что это проблема Laravel. Я тестировал его во время выполнения запроса. введите сюда описание изображения
во время выполнения запроса где-то переменная sql_mode изменилась на этапе сеанса.
Если вы зайдете в файл конфигурации Database.php внутри соединения MySQL, вы увидите, что существует строгий режим.
Если выключите его. Всякий раз, когда laravel устанавливает какое-либо соединение с базой данных, он меняет sql_mode на NO_ENGINE_SUBSTITUTION. в этом случае любое пропущенное значение из инертного оператора будет игнорироваться.
Это не ответ на ваш вопрос. Если вы считаете, что это новая информация для вашего вопроса, используйте изменить, чтобы добавить ее в вопрос.
да, извините, я знаю и перепишу ответ. @Луук
вы не можете пропускать столбцы, которые не равны нулю и не имеют значения по умолчанию.