Solución:
Correcto, el a = NULL
y b = NULL
bit fue el problema como se indicó en @a_horse_with_no_name. También puede considerar este derivado, que no requiere el OR
operador:
create table test
(
id integer primary key,
a integer,
b integer,
check ((a IS NULL) != (b IS NULL))
);
Por supuesto que funciona exclusivamente con solo dos columnas. XOR
comparación. Con tres o más columnas XOR
En comparación con una tabla de prueba similar, podría recurrir a un enfoque similar más parecido a este:
create table test
(
id integer primary key,
a integer,
b integer,
c integer,
check ((a IS NOT NULL)::INTEGER +
(b IS NOT NULL)::INTEGER +
(c IS NOT NULL)::INTEGER = 1)
);
No puedes comparar valores NULL con =
, necesitas IS NULL
(a IS NOT NULL AND b is NULL) OR (b IS NOT NULL AND a is NULL)
Para una restricción de verificación, debe encerrar toda la expresión entre paréntesis:
create table xor_test
(
id integer primary key,
a integer,
b integer,
check ((a IS NOT NULL AND b is NULL) OR (b IS NOT NULL AND a is NULL))
);
-- works
INSERT INTO xor_test(id, a, b) VALUES (1, null, 1);
-- works
INSERT INTO xor_test(id, a, b) VALUES (2, 1, null);
-- failse
INSERT INTO xor_test(id, a, b) VALUES (3, 1, 1);
Alternativamente, la restricción de verificación se puede simplificar para
check ( num_nonnulls(a,b) = 1 )
También es más fácil de ajustar a más columnas.
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)