2011-03-29 12 views
7

Estoy buscando una manera simple de limitar una tabla de configuración de la aplicación a 1 fila. Sé que puedo hacer esto con una columna virtual que contiene una subconsulta, o una vista materializada en la parte superior, pero en realidad es una tabla simple Me gustaría una restricción que no requiere más líneas para implementar que para crear la tabla.Restricción simple para limitar una tabla de Oracle a una sola fila

La manera más simple en la que he pensado es en un campo de ID establecido en 1, y una restricción de verificación de que el ID debe ser 1, pero esto agrega un campo adicional confuso a la tabla, así que espero que haya algo obvio Me falta, como una restricción de verificación donde UNIQUE_FIELD = MAX (UNIQUE_FIELD), que no está permitido.

+0

¿Por qué necesita esto? Por cierto, tal vez deberías aceptar algunas respuestas a las preguntas anteriores que publicaste. – HardCode

+0

1) En realidad, hay 2 o 3 publicaciones SO que hablan de eso, el porqué. En mi caso, estoy agregando una tabla de versiones y quiero aplicar la regla que los scripts de la versión de la base de datos deben actualizar en lugar de agregarle una fila adicional. Con el tiempo, las consultas de verificación de versiones dependerán de esto. 2) No me he permitido cerrar las preguntas para las cuales obtuve respuestas, pero no la respuesta a la pregunta que hice. Los revisaré de nuevo, es posible que me haya perdido algo. – orbfish

Respuesta

13

más simple es un índice basado en la función única en una constante

> create unique index table_uk on one_row_table ('1'); 

Alternativas:

En lugar de una tabla, se podría tener una vista sobre DUAL Eso realmente significaría ninguna actualización se en realidad ser una VISTA CREAR O REEMPLAZAR que puede no ser apropiada. Las funciones que devuelven valores de un cuerpo de paquete o contextos de aplicación global pueden ser una solución para eso si causa problemas de invalidación.

Con 11g una tabla de sólo lectura (o, en versiones anteriores, una mesa en un espacio de tabla única lectura) es una opción.

+0

+1: me gusta su idea de índice, simple y eficiente. No estoy seguro de que la tabla READ ONLY permita actualizaciones aunque ... –

+0

Ya he hecho la columna ficticia y la restricción, pero me gusta este modismo. Lo único que queda es probar si la exportación no puede manejarlo (ya que no puede manejar columnas virtuales que también dependen de funciones). – orbfish

6

Estas son algunas opciones:

  • revocar los privilegios de inserción de esa mesa.
  • gestionar toda acceso a la tabla de configuración a través de procedimientos
  • Reemplazar la tabla de configuración con una vista que esconde una columna con una restricción de comprobación (col = 1) y una restricción única.
  • Cree que se materializó vista de todos modos
  • Crear una tabla de desencadenar los incendios en INSERT que produce una excepción
  • replantear la estructura de la tabla y añadir un FROM_DATE, por lo que la tabla no se actualiza pero se crea una nueva fila cada vez . Su configuración actual será la fila con la fecha más alta from_date. Una vista current_config sobre esa tabla es útil.
  • Reemplace la tabla con una vista definida como SELECT 1024 as buffer_size, '/var/tmp' as temp_dir, 'other constant' as other_constant from dual. Esta no es una solución sólida.
+0

Ojalá pudiera darle el punto por todo su esfuerzo, pero el otro tipo contestó mejor la pregunta. Gracias por la lista de opciones, estoy seguro de que volveré a referirme aquí. – orbfish

+0

No se preocupe, también le di mi voto :) ¡y aprendí algo en el proceso! – Ronnis

0
CREATE TABLE Singleton 
(x INTEGER NOT NULL UNIQUE CHECK (x = 1), 
col1 INTEGER NOT NULL); 

(no probado)

SQL no tiene una sintaxis concisa para especificar el conjunto vacío de atributos como una clave, que es una lástima, ya que eliminaría la necesidad de que la columna adicional redundante. La clave efectiva aquí en realidad ES el conjunto vacío, que es la razón por la que he usado una restricción ÚNICA en lugar de PRIMARY KEY para la restricción en x.

+0

Esta es la solución en mi segundo párrafo. – orbfish

Cuestiones relacionadas