Pregunta sin explicación:
¿Hay alguna forma de tener una restricción de 2 valores nulos que siempre requiere que 1 tenga valor? Por ejemplo, dos columnas de fecha son nulas pero tienen al menos 1 que requiere tener un valor
Descripción del problema:
Digamos que tengo una tabla llamada Gastos
y tiene 2 fechas:
prevision_expense_expiration_date FECHA NULABLE gasto_pago_fecha FECHA NULABLE
La lógica de esas 2 columnas es la siguiente:
Hice una compra de algo y sé que tengo que pagarlo, alguna fecha, como una factura telefónica. Ingresaré esto como gasto con una fecha_pago_pago. Esta fecha es la supuesta fecha que debo pagar pero no la fecha real del pago, como la fecha de vencimiento de la factura.
En otra situación, vendo una tarjeta de regalo de algún proveedor por su servicio. Es posible que tenga que pagar la compra a mi proveedor del servicio transferido a mi cliente solo si el cliente canjea la tarjeta. Por lo tanto, la tarjeta de regalo tiene una fecha de vencimiento, quiero hacer una previsión para ese "gasto" sin insertar como gasto por el tiempo que la tarjeta de regalo es válida, si la tarjeta de regalo caduca, ese "gasto" no debe ingresar en la cuenta sistema.
Sé que puedo tener 2 tablas iguales llamadas prevision_expense y confirmado_expense pero no suena bien, así que tengo en la misma tabla, 2 fechas, anulables, pero quiero restringir o algo para que siempre se requiera una.
Hay otra estrategia posible:
payment_date DATE NOT NULL is_prevision_date BOOL NOT NULL
Entonces, en este caso, si la fecha es la previsión, el valor de bool sería 1, de lo contrario será 0. Sin valores nulos, todo está bien. excepto que quiero la opción de almacenar AMBOS valores cuando primero tengo una fecha de previsión y LUEGO (digamos dos días después) tengo una fecha confirmada para ese gasto, en cuyo caso con la estrategia 2 no tendré esa opción.
¿Estoy haciendo todo mal en el diseño de la base de datos? :RE
fuente
CHECK
restricción. No hay necesidad de columna 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) )
Encontré un artículo que se parece a lo mismo aquí
fuente