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 / dba / Perguntas / 22844
Accepted
maxschlepzig
maxschlepzig
Asked: 2012-08-22 08:06:48 +0800 CST2012-08-22 08:06:48 +0800 CST 2012-08-22 08:06:48 +0800 CST

Como restringir sequência como tipo de ID para tipo C como int64_t, uint64_t, int32_t?

  • 772

Em C99, posso ser bastante claro sobre o tamanho/domínio de um tipo inteiro.

Ao fazer a interface de um banco de dados SQL como Oracle ou Postgresql de um programa C, desejo criar uma tabela com tipos inteiros que correspondam aos do cliente.

Por exemplo, para corresponder int64_t, uint64_t ou uint32_t etc. para uma sequência como coluna de chave primária artificial.

Apenas usar NUMBER permitiria dados que geram um estouro/subfluxo ou não são representáveis ​​no idioma do cliente, certo?

Como definir corretamente essa coluna?

Motivação

Por que você quer tal coisa? Porque você quer escrever um software confiável. Digamos que você crie um aplicativo cliente de banco de dados e suponha que só precisa de menos de 2 ^ 32 IDs. Assim, para economizar espaço (por exemplo, com matrizes do lado do cliente, etc.), você usa uint32_t (ou apenas int). Mas, por segurança, o banco de dados deve impor essa restrição de forma que seu sistema falhe de maneira bem definida, graciosa e perceptível (por exemplo, rejeitando inserções violadoras) caso, 20 anos depois, algum usuário queira inserir toneladas de IDs ou algo parecido.

sistema de banco de dados

Idealmente, a solução deve ser portável entre bancos de dados (afinal, SQL é um padrão internacional) - mas uma resposta específica para Oracle/Postgres também seria instrutiva - muitas vezes, se você souber como fazê-lo em um sistema de banco de dados, poderá procure o conceito abstrato na documentação do outro.

Tipos vs. gatilhos

Não precisa ser uma solução somente de tipo - os gatilhos são outros mecanismos que impõem restrições também. Eu apenas imaginei que usar tipos poderia ser uma maneira conveniente.

datatypes
  • 3 3 respostas
  • 251 Views

3 respostas

  • Voted
  1. a_horse_with_no_name
    2012-08-22T08:15:51+08:002012-08-22T08:15:51+08:00

    Não acho que você possa restringir isso pela escolha do tipo de dados.

    No entanto, você pode criar uma restrição de verificação que garanta que nenhum valor seja inserido que não possa ser representado em sua linguagem de programação:

    alter table foo 
       add constraint check_type_range check (int_column < 32767);
    

    Você terá que substituir o valor real por aquele que corresponde ao tipo de dados escolhido (não faço C, então não sei quais são esses limites).

    • 3
  2. Best Answer
    mruether
    2012-09-01T05:18:48+08:002012-09-01T05:18:48+08:00

    Uma simples restrição do domínio do tipo de dados SQL por uma restrição é a forma mais natural. Você tem duas opções

    1. adicionando uma restrição à coluna da(s) sua(s) tabela(s) em questão
    2. criando um domínio para cada tipo de dados que você deseja adaptar para atender às suas limitações da linguagem de programação

    Um exemplo das primeiras opções se parece com

    ALTER TABLE table_name 
      ADD CONSTRAINT constraint_name 
    CHECK (column_name > -128 AND column_name < 127);
    

    (altere a tabela, a restrição e o nome da coluna conforme necessário e ajuste o intervalo dos limites verificados)

    A segunda opção é um processo de duas etapas. Primeiro adicione um novo domínio ao seu banco de dados (neste exemplo, o tipo de domínio é denominado c_byte8) com o comando

    CREATE DOMAIN c_byte8 NUMERIC CONSTRAINT c_byte8_constraint
     CHECK (VALUE > -128 AND VALUE < 127);
    

    Em segundo lugar, crie sua tabela com os tipos apropriados, ig c_byte8 em vez de NUMERIC como o tipo do atributo. Por exemplo

    CREATE TABLE test_table_1 (id NUMERIC, byte_value c_byte8);
    

    Lembre-se de que a primeira solução exigirá que você adicione restrições a cada atributo definido ou definido no futuro. Isso torna seu script de criação de banco de dados menos legível, devido à repetição da mesma condição de restrição toda vez que você usa o domínio restrito. Uma segunda desvantagem dessa abordagem é que você pode facilmente perder algumas colunas de seu esquema ao adicionar essas restrições a um esquema existente.

    Uma vantagem da primeira solução é que você pode estender um esquema existente sem muito trabalho.

    Quanto à segunda abordagem, a vantagem é um script de criação de banco de dados mais legível, como é o mesmo com as definições de tabela de um banco de dados de produção em execução, mas alterar um banco de dados de produção existente é mais complicado.

    • 3
  3. Mike Sherrill 'Cat Recall'
    2012-08-22T15:27:23+08:002012-08-22T15:27:23+08:00

    Eu ficaria tentado a procurar as informações necessárias durante a construção e mapear o resultado para os tipos de dados da linguagem de implementação. Por exemplo, posso procurar as informações de que você precisa nas views information_schema do PostgreSQL .

    select column_name, data_type, numeric_precision, numeric_precision_radix, numeric_scale
    from information_schema.columns
    where table_catalog = 'sandbox'
      and table_schema = 'public'
      and table_name = 'payors'
      and column_name = 'payor_id'
    
    column_name  data_type  numeric_precision  numeric_precision_radix  numeric_scale
    --
    payor_id     integer    32                 2                        0
    
    • 1

relate perguntas

  • Como posso alterar o tipo de uma coluna de dinheiro para decimal no PostgreSQL?

  • Qual é a diferença entre os tipos de dados VARCHAR e VARCHAR2 do Oracle?

  • Migrando de NTEXT para NVARCHAR(MAX)

  • Obter registros entre o intervalo de tempo

  • INT(5) vs SMALLINT(5): números entre parênteses após o tipo numérico

Sidebar

Stats

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

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

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