После обновления до MySQL 8.0 я столкнулся со следующей проблемой:
У меня есть две таблицы, назовем их A и B. B имеет ссылку на столбец для таблицы A и набор ограничений (внешний ключ)так что при удалении ссылочного объекта значение устанавливается равным нулю (ON DELETE SET NULL).
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES UTF8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE TABLE `A` (
`ID` VARCHAR(32) CHARACTER SET UTF8 COLLATE UTF8_BIN NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=INNODB DEFAULT CHARSET=UTF8;
CREATE TABLE `B` (
`ID` VARCHAR(32) CHARACTER SET UTF8 COLLATE UTF8_BIN
DEFAULT NULL,
`COL_B` VARCHAR(32) CHARACTER SET UTF8 COLLATE UTF8_BIN
DEFAULT NULL,
CONSTRAINT `B_FK5` FOREIGN KEY (`COL_B`) REFERENCES `A` (`ID`)
ON
DELETE SET NULL
) ENGINE=INNODB DEFAULT CHARSET=UTF8;
INSERT INTO `A` (`ID`) VALUES ('1');
INSERT INTO `B` (`ID`,`COL_B`) VALUES ('1','1');
DELETE FROM A;
SELECT * FROM B;
Проблема: при удалении элемента из таблицы A ссылка в таблице B не устанавливается равной нулю(ключ остается, хотя объект с этим ключом был удален).
Дополнительная информация: До сих пор я использовал MySql 5.7 и у меня не было этой проблемы.После перехода на MySql 8.0.15 я начал видеть это поведение.Кроме того, эта проблема возникает только на локальных и компакт-дисках и не воспроизводится на облачных машинах.Как результат, некоторые тесты начали давать сбой при запуске заданий на CD.
Другая странная вещь заключается в том, что непосредственно перед удалением элемента, если в таблицу A внесено изменение (порядок переключения столбцов), проблема не возникает.
Я также пытался использовать MySQL на Docker, и проблема та же.Действительно, это проблема блокировки, и тот факт, что это происходит только в этом случае, усложняет понимание.Из журналов MySQL я не мог получить присед.
Любая подсказка, которая могла бы помочь с этим расследованием?
ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ: ограничение правильно определено, оно работало до сих пор