filas - pivot oracle columns to rows
¿Cómo restringir una tabla de base de datos para que solo una fila pueda tener un valor particular en una columna? (7)
¿Oracle admite algo así como índices filtrados (la semana pasada escuché que, por ejemplo, MSSQL2008 lo hace)? Tal vez pueda definir una clave única que se aplica solo a las filas con el valor "Sí" en su columna.
Usando Oracle, si el valor de una columna puede ser ''SÍ'' o ''NO'', ¿es posible restringir una tabla para que solo una fila pueda tener un valor ''SÍ''?
Preferiría rediseñar la estructura de la tabla, pero esto no es posible.
[UDPATE] Lamentablemente, los valores nulos no están permitidos en esta tabla.
Deberá consultar un artículo de Tom Kyte con exactamente esta pregunta y su respuesta:
http://tkyte.blogspot.com/2008/05/another-of-day.html
Resumen: no use desencadenantes, no use transacciones autónomas, use dos tablas.
Si utiliza una base de datos Oracle, entonces DEBE conocer a AskTom y obtener sus libros.
Este es un hack kludgy, pero si la columna permite valores NULL, entonces podría usar NULL en lugar de "NO" y usar "YES" igual que antes. Aplique una restricción de clave única a esa columna, y nunca obtendrá dos valores "SÍ", pero aún tendrá muchos NO.
Actualización: @Nick Pierpoint: sugirió agregar una restricción de verificación para que los valores de la columna estén restringidos a solo "SÍ" y NULO. La sintaxis está resuelta en su respuesta.
No funciona en la definición de la tabla.
Sin embargo, si actualiza la tabla utilizando un desencadenante que invoca un procedimiento almacenado, puede asegurarse de que solo una fila contenga "SÍ".
- Establezca todas las filas en "NO"
- Establezca la fila que desea SÍ
Siguiendo con mi comentario a una respuesta anterior de yukondude, agregaría un índice único y una restricción de verificación:
create table mytest (
yesorno varchar2(3 char)
);
create unique index uk_mytest_yesorno on mytest(yesorno);
alter table mytest add constraint ck_mytest_yesorno check (yesorno is null or yesorno = ''YES'');
Supongo que usaría una segunda tabla para señalar la fila apropiada en su tabla actual. Esa otra tabla también podría usarse para almacenar valores de otras variables.
Use un índice basado en funciones:
create unique index only_one_yes on mytable
(case when col=''YES'' then ''YES'' end);
Oracle solo indexa claves que no son completamente nulas, y la expresión CASE aquí asegura que todos los valores ''NO'' se cambian a nulos y por lo tanto no se indexan.