Pergunta sem explicação:
Existe uma maneira de ter uma restrição de 2 valores nulos que sempre exige que 1 tenha valor? Por exemplo, duas colunas de data nulas, mas com pelo menos 1 que requer um valor
Descrição do Problema:
Digamos que tenho uma tabela chamada Despesa
e tem 2 datas:
prevision_expense_expiration_date DATE NULLABLE expens_payment_date DATE NULLABLE
a lógica dessas 2 colunas é a seguinte:
Fiz uma compra de algo e sei que tenho que pagar por isso em algum momento, como uma conta de telefone. Vou inserir isso como uma despesa com um gasto_pagamento_data. Esta data é a data suposta que devo pagar, mas não a data real do pagamento, como a data de vencimento da fatura.
Em outra situação, vendo um cartão-presente de algum provedor por seu serviço. Eu posso ter a despesa de comprar ao meu provedor o serviço transferido para o meu cliente apenas se o cliente resgatar o cartão. Portanto, o cartão-presente tem uma data de validade, quero fazer uma previsão para essa 'despesa' sem inserir como despesa pelo tempo que o cartão-presente é válido, se o cartão-presente expirar, essa 'despesa' não deve entrar na conta sistema.
Eu sei que posso ter 2 tabelas iguais chamadas prevision_expense e confirm_expense, mas não parece certo, por isso tenho na mesma tabela 2 datas anuláveis, mas quero restringir ou algo assim para que seja sempre necessário.
Há outra estratégia possível:
payment_date DATA NÃO NULL is_prevision_date BOOL NOT NULL
Portanto, nesse caso, se a data for o valor boológico de previsão, será 1, caso contrário, será 0. Nenhum valor nulo, tudo está bom. exceto que desejo a opção de armazenar AMBOS os valores quando tiver uma data de previsão e THEN (digamos, dois dias depois) tiver uma data confirmada para essa despesa; nesse caso, com a estratégia 2, não terei essa opção.
Estou fazendo tudo errado no design do banco de dados? : D
fonte
CHECK
restrição. Não há necessidade de coluna persistente.CREATE TABLE Test_Constraint2 ( A DateTime Null, B DateTime Null, CONSTRAINT A_or_B_Not_Null CHECK (CASE WHEN A IS Null AND B IS Null THEN 0 ELSE 1 END = 1) )
Encontrei um artigo que se parece com a mesma coisa aqui
fonte