MySQL ошибка 1022 при вставке. Как исправить? - PullRequest
0 голосов

У меня очень странная проблема с моей базой данных MariaDB. Я использую его в паре с gorm Когда я пытаюсь сделать запрос на вставку в одну из таблиц, я получаю сообщение об ошибке

Ошибка 1022: не могу писать; дублирующийся ключ в таблице «title»

Хорошо. Пробую использовать один и тот же код прямо из Navicat или Datagrip и MAGI C - все работает и вставка записей. Я проверил внешние ключи - все они имеют уникальные имена, но я до сих пор не знаю, как это моделировать.

Определение таблицы

/*
Navicat MariaDB Data Transfer

Source Server         : My Hetzner
Source Server Version : 100316
Source Host           : 127.0.0.1:3306
Source Database       : sovet_api

Target Server Type    : MariaDB
Target Server Version : 100316
File Encoding         : 65001

Date: 2020-05-09 18:46:52
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for titles
-- ----------------------------
DROP TABLE IF EXISTS `titles`;
CREATE TABLE `titles` (
  `anime_id` int(11) NOT NULL,
  `anime_name` varchar(255) DEFAULT NULL,
  `anime_name_rus` varchar(255) DEFAULT NULL,
  `ai_help` varchar(255) DEFAULT NULL,
  `pidor_ban` int(11) DEFAULT 0,
  `vk_new_template_sub` text CHARACTER SET utf8mb4 DEFAULT NULL,
  `vk_new_template_dub` text CHARACTER SET utf8mb4 DEFAULT NULL,
  `video_name_template_sub` varchar(255) DEFAULT '',
  `video_name_template_dub` varchar(255) DEFAULT '',
  `video_desc_template_sub` text DEFAULT NULL,
  `video_desc_template_dub` text DEFAULT NULL,
  `telegram_new_template_sub` text CHARACTER SET utf8mb4 DEFAULT NULL,
  `telegram_new_template_dub` text CHARACTER SET utf8mb4 DEFAULT NULL,
  `telegram_sub_group_id` bigint(20) DEFAULT -1001269855704,
  `telegram_dub_group_id` bigint(20) DEFAULT -1001269855704,
  `vk_banned` int(11) DEFAULT 0,
  `command_sub_id` int(11) DEFAULT 1,
  `command_dub_id` int(11) DEFAULT 1,
  `default_preroll_id_sub` int(11) DEFAULT NULL,
  `default_watermark_id_sub` int(11) DEFAULT NULL,
  `default_preroll_id_dub` int(11) DEFAULT NULL,
  `default_watermark_id_dub` int(11) DEFAULT NULL,
  `vk_sub_group_id` bigint(20) DEFAULT 33905270,
  `vk_dub_group_id` bigint(20) DEFAULT 33905270,
  `vk_album_id_sub` int(11) DEFAULT NULL,
  `vk_album_id_dub` int(11) DEFAULT NULL,
  `repost_sub_vk_group_id` int(11) DEFAULT 0,
  `repost_dub_vk_group_id` int(11) DEFAULT 0,
  `default_sub_add_att` text DEFAULT NULL,
  `default_dub_add_att` text DEFAULT NULL,
  `gdrive_parent_id` varchar(255) DEFAULT NULL,
  `gdrive_torrent_id` varchar(255) DEFAULT NULL,
  `gdrive_sub_id` varchar(255) DEFAULT NULL,
  `gdrive_font_id` varchar(255) DEFAULT NULL,
  `ai_search_enabled` int(11) DEFAULT 1,
  `nyaa_scan_enabled` int(11) DEFAULT 0,
  `anime_shiki_id` int(11) DEFAULT NULL,
  `anime_name_jpn` varchar(255) DEFAULT NULL,
  `anime_rating` varchar(255) DEFAULT NULL,
  `anime_episodes` int(255) DEFAULT 0,
  `hashtags` text DEFAULT NULL,
  `subscribe_sub_enabled` smallint(6) DEFAULT 0,
  `subscribe_dub_enabled` smallint(6) DEFAULT 0,
  `subscribe_priority` smallint(6) DEFAULT 0,
  `sub_purse` bigint(255) DEFAULT NULL,
  `dub_purse` bigint(255) DEFAULT NULL,
  `sub_qiwi` varchar(255) DEFAULT NULL,
  `dub_qiwi` varchar(255) DEFAULT NULL,
  `sub_paypal` varchar(255) DEFAULT NULL,
  `dub_paypal` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`anime_id`),
  KEY `command_sub_id` (`command_sub_id`),
  KEY `command_dub_id` (`command_dub_id`),
  KEY `default_watermark_id_sub` (`default_watermark_id_sub`),
  KEY `default_watermark_id_dub` (`default_watermark_id_dub`),
  KEY `default_preroll_id_sub` (`default_preroll_id_sub`),
  KEY `default_preroll_id_dub` (`default_preroll_id_dub`),
  FULLTEXT KEY `IDX__titles__anime_name_search` (`anime_name`,`ai_help`),
  FULLTEXT KEY `IDX__titles__anime_name_search_bot` (`anime_name`,`anime_name_rus`,`ai_help`),
  CONSTRAINT `titles_ibfk_1` FOREIGN KEY (`command_sub_id`) REFERENCES `command` (`command_id`) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT `titles_ibfk_2` FOREIGN KEY (`command_dub_id`) REFERENCES `command` (`command_id`) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT `titles_ibfk_3` FOREIGN KEY (`default_watermark_id_sub`) REFERENCES `watermarks` (`watermark_id`) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT `titles_ibfk_4` FOREIGN KEY (`default_watermark_id_dub`) REFERENCES `watermarks` (`watermark_id`) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT `titles_ibfk_5` FOREIGN KEY (`default_preroll_id_sub`) REFERENCES `prerolls` (`preroll_id`) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT `titles_ibfk_6` FOREIGN KEY (`default_preroll_id_dub`) REFERENCES `prerolls` (`preroll_id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

и

DROP TRIGGER IF EXISTS `trigger_hash_gen`;
DELIMITER ;;
CREATE TRIGGER `trigger_hash_gen` AFTER INSERT ON `titles`
FOR EACH ROW
    IF NOT EXISTS (SELECT * FROM title_hashtags
         WHERE hashtag_value =    TRIM(BOTH '_' FROM
             REGEXP_REPLACE(NEW.anime_name, '[^a-zA-Z0-9]+','_')))
    THEN
        INSERT INTO title_hashtags(anime_id, hashtag_value)
            VALUES (NEW.anime_id, TRIM(BOTH '_' FROM
             REGEXP_REPLACE(NEW.anime_name, '[^a-zA-Z0-9]+','_')));
END IF
;;
DELIMITER ;

Код SQL

INSERT INTO `titles` (`anime_id`,`anime_name`,`anime_name_rus`,`pidor_ban`,`vk_new_template_sub`,`vk_new_template_dub`,`video_name_template_sub`,`video_name_template_dub`,`video_desc_template_sub`,`video_desc_template_dub`,`telegram_new_template_sub`,`telegram_new_template_dub`,`telegram_sub_group_id`,`telegram_dub_group_id`,`vk_banned`,`vk_sub_group_id`,`vk_dub_group_id`,`vk_album_id_sub`,`vk_album_id_dub`,`default_sub_add_att`,`default_dub_add_att`,`gdrive_parent_id`,`gdrive_torrent_id`,`gdrive_sub_id`,`gdrive_font_id`,`anime_shiki_id`,`anime_name_jpn`,`anime_rating`,`anime_episodes`,`subscribe_sub_enabled`,`subscribe_dub_enabled`,`subscribe_priority`,`sub_purse`,`dub_purse`,`sub_qiwi`,`dub_qiwi`,`sub_paypal`,`dub_paypal`,`ai_search_enabled`,`nyaa_scan_enabled`)
    VALUES ('1046','Urashimasakatasen no Nichijou Special','Деньки Урасимасакатасэн: Школьная пора — Эпизод 13','0','','','','','','','','','0','0','0','0','0','56053731','56053731','','','1-SHGDPX_ybF0Kqu0rtLKcnY_rmfsXa96','1WmRjv8fsZAAY2uBGoRx76Ar1B8rJGKcj','1TvlCnAQ6DbLR3WWiePDCJerYNEwX09oW','1nZRP4Yf92DyuyeOPtW44_vzZLENN6gs6','40921','','','0','0','0','0','0','0','','','','','0','0')

Но когда я пытаюсь использовать ТО ЖЕ SQL в datagrip, navicat или что-то еще - он работает

Спасибо!

1 Ответ

0 голосов
/ 25 мая 2020

Как насчет того, чтобы не делать IF...SELECT; просто выполните INSERT IGNORE ....

Или, может быть, INSERT ... ON DUPLICATE KEY UPDATE ...

...