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 / coding / Perguntas / 76979368
Accepted
ZedZip
ZedZip
Asked: 2023-08-26 01:22:36 +0800 CST2023-08-26 01:22:36 +0800 CST 2023-08-26 01:22:36 +0800 CST

PostgreSQL: como validar campos JSON?

  • 772

Quero usar o tipo JSON em vez de tabela. Por exemplo: CREATE TABLE xds ( id serial NOT NULL PRIMARY KEY, info json NOT NULL ); INSERT INTO xds (info) VALUES('{ "cliente": "Lily Bosch", "type": ["vendas","marketing","escritório"]}'), ('{ "cliente": "Josh William ","type": ["vendas", "escritório"]}'), ('{ "cliente": "Mary Clark", "type": ["gerenciamento","startup"]}'); Mas eu gostaria de validar o "type", seus valores deveriam ser de outra tabela. Posso fazer validação em triggers (I, U) mas como fazer?

json
  • 1 1 respostas
  • 16 Views

1 respostas

  • Voted
  1. Best Answer
    Muhammad Sarmad
    2023-08-26T04:01:25+08:002023-08-26T04:01:25+08:00

    Concordando com o comentário de Mike acima, o que você está tentando fazer é uma má ideia, porque você terá que fazer um esforço extra para fazer isso. Se você realmente deseja usar JSON, aqui está o método possível:

    Uma função de gatilho e uma restrição de verificação podem ser criadas. Faça primeiro uma tabela de referência com valores de "tipo" apropriados:

    CREATE TABLE valid_types (
        type_value text PRIMARY KEY
    );
    
    INSERT INTO valid_types (type_value) VALUES ('sales'), ('marketing'), ('office'), ('management'), ('startup');
    

    Crie uma função de gatilho que verifique os valores dos parâmetros de "tipo" JSON:

    CREATE OR REPLACE FUNCTION validate_json_type()
        RETURNS TRIGGER AS $$
    BEGIN
        IF NEW.info->'type' IS NOT NULL THEN
            IF NOT (SELECT jsonb_agg(type_value) FROM valid_types) @> (NEW.info->'type')::jsonb THEN
                RAISE EXCEPTION 'Invalid "type" value in JSON';
            END IF;
        END IF;
        RETURN NEW;
    END;
    $$ LANGUAGE plpgsql;
    

    Crie um gatilho na tabela para invocar a função de gatilho e então:

    CREATE TRIGGER json_type_validation
    BEFORE INSERT OR UPDATE ON xds
    FOR EACH ROW
    EXECUTE FUNCTION validate_json_type();
    

    Essa configuração garante que as entradas "type" na coluna JSON da tabela "xds" sejam verificadas em relação à tabela de referência "valid_types", lançando uma exceção se algum valor estiver faltando.

    Para obter mais orientações, você também pode consultar esta documentação . Eu espero que isso ajude.

    • 1

relate perguntas

  • filtragem jq em chave específica e agrupamento de valores em uma única célula csv

  • Elasticsearch: Erro ao criar réplicas em cluster de 2 nós

  • Mensagem de erro do Apex de vendas em uma linha em que nada foi alterado

  • Como usar a função de tecla XSLT 3.0

Sidebar

Stats

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

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +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