AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-3807703

andreibaboi's questions

Martin Hope
andreibaboi
Asked: 2023-08-27 06:15:24 +0800 CST

Os gatilhos não funcionam conforme o esperado para colunas SET no mariadb

  • 4

Isso não funciona, eu crio o gatilho perfeitamente, mas quando insiro algo nessa tabela, recebo # 1054 - Coluna desconhecida 'disponíveis_métodos' em 'lista de campos'

CREATE TRIGGER `add_notification_type` AFTER INSERT ON `notification_types`
 FOR EACH ROW BEGIN
    INSERT IGNORE INTO unit_templates (unit, idkey, method)
    SELECT u.id AS unit, NEW.idkey, m.method
    FROM units AS u
    JOIN (
            SELECT 'sms' as method
            UNION ALL
            SELECT 'push'
            UNION ALL
           SELECT 'email'
            UNION ALL
            SELECT 'chat'
            UNION ALL
            SELECT 'info'
    ) AS m ON FIND_IN_SET(m.method, NEW.available_methods) > 0;
END

Isso funciona:

CREATE TRIGGER `add_notification_type` AFTER INSERT ON `notification_types`
 FOR EACH ROW BEGIN
    DECLARE available_methods_var VARCHAR(255);

    SET available_methods_var = NEW.available_methods;

    INSERT IGNORE INTO unit_templates (unit, idkey, method)
    SELECT u.id AS unit, NEW.idkey, m.method
    FROM units AS u
    JOIN (
        SELECT 'sms' as method
        UNION ALL
        SELECT 'push'
        UNION ALL
        SELECT 'email'
        UNION ALL
        SELECT 'chat'
        UNION ALL
        SELECT 'info'
    ) AS m ON FIND_IN_SET(m.method, available_methods_var) > 0;
END

O problema aparece apenas para colunas do tipo SET/ENUM (na verdade tentei apenas SET). O estranho é que no mariadb 10.3 o problema apareceu apenas nos gatilhos AFTER UPDATE mas no AFTER INSERT estava funcionando. Após atualizar para o mariadb 11 o insert AFTER não funcionou mais e tive que declarar as variáveis ​​antes e não usar o NEW.available_methods na consulta.

Alguém sabe por que isso acontece? Até tentei perguntar ao chatgpt mas a resposta dele foi e cito "é estranho" :)). Ele me disse que provavelmente tinha algo a ver com a versão do mariadb, mas isso não explica as coisas.

desde já, obrigado

Tentei a primeira variante primeiro e esperava que funcionasse

--ATUALIZAR--

Estas são as tabelas envolvidas:

--
-- Table structure for table `notification_types`
--

CREATE TABLE `notification_types` (
  `idkey` varchar(40) NOT NULL,
  `title` varchar(100) NOT NULL,
  `editable` tinyint(1) NOT NULL DEFAULT 1,
  `has_days` tinyint(1) NOT NULL DEFAULT 0,
  `default_days` int(3) NOT NULL DEFAULT 0,
  `has_sessions` tinyint(1) NOT NULL DEFAULT 0,
  `default_sessions` int(3) NOT NULL DEFAULT 0,
  `available_methods` set('sms','push','email','chat','info') NOT NULL,
  `default_methods` set('sms','push','email','chat','info') NOT NULL,
  `class` set('announcements','info','marketing','system') NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

--
-- Table structure for table `units`
--

CREATE TABLE `units` (
  `id` int(11) NOT NULL,
  `name` varchar(40) NOT NULL,
  `active` int(1) NOT NULL DEFAULT 1,
  `waiting` tinyint(1) NOT NULL DEFAULT 0,
  `suspended` int(1) NOT NULL DEFAULT 0,
  `deleted` tinyint(1) NOT NULL DEFAULT 0,
  `deleted_time` int(20) NOT NULL DEFAULT 0,
  `acl` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
  `custom_fields` varchar(1000) NOT NULL DEFAULT '',
  `code` varchar(15) DEFAULT NULL,
  `settings` text NOT NULL DEFAULT '{}'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

--
-- Table structure for table `unit_templates`
--

CREATE TABLE `unit_templates` (
  `unit` int(11) NOT NULL,
  `idkey` varchar(40) NOT NULL,
  `method` set('sms','push','email','chat','info') NOT NULL,
  `template` text DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

Eu não incluí os índices

Você pode ver https://dbfiddle.uk/8IjWUeOK para aquele que funciona e https://dbfiddle.uk/sZsQou4a para aquele que não funciona

mariadb
  • 2 respostas
  • 41 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve