Почему Mysql возвращает «Столбец ошибок не может быть нулевым»?

Недавно мы перенесли нашу версию MySQL на MySQL 8, но мы столкнулись с действительно странным поведением: некоторые (действительные) запросы работали раньше, как будто чары переставали работать (иногда) без причины, и MySQL возвращал ошибку, но если мы иногда перезапускаем его оно работает.

Вот пример:

UPDATE `Members` set `ProZipCode` = 75001, `ProCity` = 'Paris', `ActivationCode` = 'AAA-15372695', `State` = 1 WHERE `MemberId` = 42;

Если я запущу этот запрос 10 раз подряд, он будет работать примерно 6 раз, но 4 раза выдаст ошибку (случайно) как в Laravel, так и в phpmyadmin:

Integrity constraint violation : Column 'ActivationCode' cannot be null 

Мы используем MySQL версии 8.0.36.

Изменить с некоторыми уточнениями:

  • Версия MySQL — 8.0.36.
  • Поле «ActivationCode» представляет собой классический столбец varchar (255) NOT NULL.
  • В таблице нет внешнего ключа или около того, есть только один триггер перед вставкой для создания MemberHash, никаких событий, блокировки или чего-то еще.
  • Я запускаю один и тот же запрос вручную 10 раз подряд в phpmyadmin или через вызов API (с теми же данными)
  • Код активации не генерируется автоматически, я обновляю его в запросе.
  • База данных размещена в Google Cloud SQL. Есть 3 флага: log_bin_trust_function_creators (вкл.), sql_mode (NO_ENGINE_SUBSTITUTION, ALLOW_INVALID_DATES), явное_default_for_timestamp (выкл.).
  • Остальные серверы работают в облаке.
  • Конечно, я мог бы просто изменить столбец, чтобы он принимал нулевое значение, но это невозможно, поскольку эта ошибка возникает в нескольких столбцах/таблицах.

Вам необходимо показать схемы создания стола. Есть ли какие-либо триггеры, события, блокировки или внешние ключи? Это удаленная база данных, поэтому, возможно, виновата некоторая задержка?

easleyfixed 18.06.2024 20:28

Но ошибка указывает на то, что в какой-то момент, возможно, из-за задержки или других ошибок, что-либо, генерирующее значение кода активации, не получило значение вовремя, чтобы быть вставленным в оператор, и поэтому ничего не передало и выдало ошибку? На самом деле хорошо, что возникает ошибка, поскольку, если бы столбец не был настроен на запрещение нулевых значений, он бы перезаписал значение в этом столбце нулевым значением.

easleyfixed 18.06.2024 20:38

Когда вы запускаете его 10 раз подряд, используете ли вы одно и то же значение ActivationCode? Если код генерируется динамически, некоторые из них могут быть нулевыми.

Barmar 18.06.2024 21:24

Как вы запускаете запрос 10 раз подряд из PhpMyAdmin?

Barmar 18.06.2024 21:24

MySQL версии 8.2.20 не существует. Пожалуйста, запустите SELECT VERSION(); и подтвердите, какую версию вы действительно используете.

Bill Karwin 18.06.2024 21:33

Привет, я отредактировал первое сообщение, включив в него некоторый контекст и ответы на ваши вопросы.

maxliguge 19.06.2024 12:12

Можете ли вы показать CREATE TABLE и триггер?

mankowitz 19.06.2024 12:18

Я не могу показать вам таблицу создания, триггер следующий: CREATE TRIGGER GenerateMemberHash BEFORE INSERT ON Members FOR EACH ROW SET NEW.MemberHash = RANDSTRING(32) Также я действительно не думаю, что это связано с конкретным столбцом или таблицей. , у нас случайно возникает одна и та же проблема в разных столбцах/таблицах, и это работало годами, прежде чем мы перешли на mysql8 и Google Cloud.

maxliguge 19.06.2024 12:38
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
8
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, переход на последнюю версию MySQL 5.7 решил нашу проблему. Мы попытались обновить MySQL до последней версии 8, но это не сработало.

Действительно странное поведение...

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