Pytanie bez wyjaśnienia:
Czy w ogóle istnieje ograniczenie 2 wartości zerowych, które zawsze wymaga wartości 1? Na przykład dwie kolumny daty, obie o wartości NULL, ale mające co najmniej 1, która wymaga wartości
Opis problemu:
Powiedzmy, że mam tabelę o nazwie Koszt
i mają 2 daty:
prevision_expense_expiration_date DATE NULLABLE data_płacenia_wydatków DATE NULLABLE
logika tych 2 kolumn jest następująca:
Dokonałem zakupu czegoś i wiem, że muszę za to zapłacić, pewnego dnia, jak rachunek telefoniczny. Wprowadzę to jako wydatek z datą_płatności. Ta data jest przypuszczalną datą, którą powinienem zapłacić, ale nie faktyczną datą płatności, jak data ważności faktury.
W innej sytuacji sprzedaję kartę podarunkową jakiegoś dostawcy za jej obsługę. I może mieć koszt zakupu do mojego dostawcy usługi przeniesiony do mojego klienta tylko wtedy, gdy klient wykupi kartę. W związku z tym data ważności karty upominkowej, chcę zrobić podgląd tego „wydatku” bez wstawiania jako wydatku na czas ważności karty upominkowej, jeśli wygasa karta upominkowa, „wydatek” nie powinien wejść na konto system.
Wiem, że mogę mieć 2 równe tabele o nazwie prevision_expense i potwierdź_expense, ale to nie brzmi dobrze, więc mam w tej samej tabeli, 2 daty, zerowalne, ale chcę ograniczyć lub coś takiego, aby zawsze była wymagana.
Istnieje inna możliwa strategia:
payment_date DATE NOT NULL is_prevision_date BOOL NOT NULL
Zatem w tym przypadku, jeśli data jest przewidywana, wartość bool wynosiłaby 1, w przeciwnym razie wynosiłaby 0. Brak wartości zerowych, wszystko jest dobrze. z wyjątkiem tego, że chcę opcję przechowywania OBU wartości, gdy najpierw mam datę prognozy, a NASTĘPNIE (powiedzmy dwa dni później) mam potwierdzoną datę tego wydatku, w takim przypadku ze strategią 2 nie mam tej opcji.
Czy robię wszystko źle podczas projektowania bazy danych? :RE
źródło
CHECK
ograniczeniem. Nie ma potrzeby utrzymywania kolumny.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) )
Znalazłem artykuł, który wygląda tak samo tutaj
źródło