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.
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:
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).
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
Um exemplo das primeiras opções se parece com
(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
Em segundo lugar, crie sua tabela com os tipos apropriados, ig c_byte8 em vez de NUMERIC como o tipo do atributo. Por exemplo
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.
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 .