Question sans explication:
Existe-t-il de toute façon une contrainte de 2 valeurs nulles qui nécessite toujours 1 pour avoir de la valeur? Par exemple, deux colonnes de date nulles mais ayant au moins 1 qui nécessite d'avoir une valeur
Description du problème:
Disons que j'ai une table appelée Dépenses
et ont 2 dates:
prevision_expense_expiration_date DATE NULLABLE dépenses_payment_date DATE NULLABLE
la logique de ces 2 colonnes est la suivante:
J'ai acheté quelque chose et je sais que je dois payer pour cela, une date, comme une facture de téléphone. Je vais saisir ceci comme une dépense avec une date de dépense_paiement. Cette date est la date supposée que je devrais payer mais pas la date réelle du paiement, comme la date d'expiration de la facture.
Dans d'autres situations, je vends une carte-cadeau d'un fournisseur pour son service. Je peux avoir à payer pour acheter à mon fournisseur le service transféré à mon client uniquement si le client utilise la carte. Par conséquent, la carte-cadeau a une date d'expiration, je veux faire une prévision pour cette «dépense» sans insérer comme dépense pour la durée de validité de la carte-cadeau, si la carte-cadeau expire, cette «dépense» ne devrait pas entrer dans le compte système.
Je sais que je peux avoir 2 tables égales appelées prevision_expense et
Il y a une autre stratégie possible:
payment_date DATE NOT NULL is_prevision_date BOOL NOT NULL
Donc, dans ce cas, si la date est une valeur booléenne de prévision serait 1, sinon sera 0. Aucune valeur nulle, tout est bon. sauf que je veux l'option de stocker les DEUX valeurs lorsque j'ai d'abord une date de prévision et ALORS (disons deux jours plus tard) avoir une date confirmée pour cette dépense, auquel cas avec la stratégie 2 je n'aurai pas cette option.
Suis-je en train de tout faire mal dans la conception de la base de données? :RÉ
la source
CHECK
contrainte. Pas besoin de colonne persistante.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) )
J'ai trouvé un article qui ressemble à la même chose ici
la source