MySQL, Сбой внешнего ключа в SP, но не при выполнении вручную - PullRequest
0 голосов
/ 14 апреля 2020

задача, которую я выполняю, кажется такой простой. Но это поведение действительно очень жуткое. Я использую MySQL.

У меня есть таблица для загруженных файлов - содержащая ID, FileName, FileHa sh, UploadDate, UploadUser et c. По сути, это XML Files.

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

Вот определение (сокращенное до критических точек):

CREATE TABLE `tbl_xmlfiles` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Filename` varchar(1024) NOT NULL,
  `FileHash` varchar(45) DEFAULT NULL,
  `UploadDate` datetime DEFAULT CURRENT_TIMESTAMP,
  `Count` int(11) NOT NULL DEFAULT '0',
  `Status` enum('uploaded','closed','error','archived') NOT NULL DEFAULT 'uploaded',
  `ScanID` int(11) DEFAULT NULL,
  ...
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=986 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='Stores all uploaded xmlfiles data';


CREATE TABLE `tbl_xmlcontents` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `FileID` int(11) NOT NULL,
  ...
  PRIMARY KEY (`ID`),
  KEY `FileID` (`FileID`),
  CONSTRAINT `fileID` FOREIGN KEY (`FileID`) REFERENCES `tbl_xmlfiles` (`ID`),
) ENGINE=InnoDB AUTO_INCREMENT=304817 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='Stores all xml content data';

Для лучшего понимания, «Сканирование» "связывает несколько XML файлов вместе.

Я, конечно, понимаю, что, если файл из таблицы файлов должен быть удален, мы сначала должны удалить строки из другой таблицы (потому что это не Каскадное противопоказание, чего я не хочу). Вот что я делаю в SP:

CREATE PROCEDURE `sp_DeleteFilesByScanID`(
    IN ScanID INT,
    IN username VARCHAR(45)
)
BEGIN
    ...
    DELETE c FROM tbl_xmlcontents c LEFT JOIN tbl_xmlfiles f ON c.FileID=f.ID WHERE f.`ScanID`=ScanID;
    DELETE FROM tbl_xmlfiles WHERE `ScanID`=ScanID;
    ...
END

При запуске этого SP он выдает ошибки:

Cannot delete or update a parent row: a foreign key constraint fails (`MYGREATTOOL`.`tbl_xmlcontents`, CONSTRAINT `fileID` FOREIGN KEY (`FileID`) REFERENCES `tbl_xmlfiles` (`ID`))

Он выдает ошибку во втором операторе «DELETE FROM tbl_xmlfiles ...». Первый выполняется, как и ожидалось.

НО здесь приходит подсказка. Когда я выполняю эти две DELETE-строки вручную в MySQL Workbench (замена параметра ScanID допустимым значением) - все работает как положено. Как это может быть, ради всего святого?

Не могли бы вы мне помочь?

Привет, xola

1 Ответ

0 голосов
/ 14 апреля 2020

Хорошо, комментарий отрывка указал мне на правильное решение. Большое спасибо!

При указании ScanID с именем / псевдонимом таблицы он рассматривается не как параметр SP "ScanID", а как имя поля.

Решение :

DELETE FROM tbl_xmlfiles x WHERE x.`ScanID`=ScanID;

Может кто-нибудь уточнить, почему парсер MySQL считает, что "ScanID" (извините, здесь есть отступы вокруг слова - Stackoverflow автоматически делает это кавычкой) является параметром SP? Разве Backticks не всегда предназначены для описания MySQL имени поля?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...