Tengo una base de datos Postges. Tengo una tabla de Categorías y quiero que 1 y solo 1 sea considerada como "Predeterminada". Parece que podría tener un campo booleano con una restricción única y simplemente usar nulo en lugar de valores falsos, y eso funcionaría, pero preferiría una configuración en la que si marco una fila como predeterminada, automáticamente establecerá eso en nulo en todos otras filas. También me gustaría asegurarme de que haya un conjunto predeterminado. Podría crear una segunda tabla con 1 fila y 1 columna para rastrear la identificación de la fila predeterminada, que podría hacer cumplir para que tenga un valor y sea una identificación válida, pero parece excesivo tener una tabla solo para eso. hay una manera mas facil?
Tienes múltiples opciones.
Puede crear un procedimiento almacenado (o 3 procedimientos almacenados) en PostgreSQL para insertar, actualizar y eliminar datos. En el procedimiento almacenado, puede agregar la lógica para asegurarse de que al menos una de las filas esté configurada como predeterminada y el resto de ellas como no predeterminadas.
Puede crear un activador que, después de insertar, actualizar o eliminar, aplique la misma lógica.
Me gusta la idea de tener una tabla separada categories_default . Esto le permite un poco más de flexibilidad y menos exageraciones, en mi opinión, que el método anterior. Si escribe en esa tabla que category_id 123 es el predeterminado, pero mañana su requisito cambia de modo que desea una combinación predeterminada por category_id + color, puede hacerlo con una tabla como esta. También es fácil de actualizar en lugar de las opciones anteriores. En las opciones anteriores, si desea marcar una sola fila como predeterminada, debe escanear todas las filas, encontrar el valor predeterminado existente, cambiarlo a no predeterminado y luego aplicar la fila seleccionada como predeterminada. Entonces, hay muchas lecturas/escrituras.
Su idea con la tabla adicional es buena. Solo asegúrese de tener una restricción de clave externa de esa tabla de una fila a su tabla. Asegúrese de que la tabla no pueda contener más de una fila con un índice:
CREATE UNIQUE INDEX ON single ((1));