2010-05-18 17 views
5

¿Cuál es la forma más limpia de restringir una tabla SQL para que no tenga más de una fila?Restringir una tabla para tener solo una fila

This related question explica por qué tal tabla puede existir, pero no cómo debe implementarse la restricción.

Hasta ahora solo he encontrado hacks que involucran una columna de clave única que está restringida a tener un valor específico, p. ALWAYS_0 TINYINT NOT NULL PRIMARY KEY DEFAULT (0) CONSTRAINT CHECK_ALWAYS_0 CHECK (ALWAYS_0 = 0). Supongo que probablemente haya una forma más limpia de hacerlo.

La solución ideal sería SQL portátil, pero una solución específica para MS SQL Server o Postgres también sería útil

Respuesta

1

Acabo de resolver el mismo problema en SQL Server 2008 mediante la creación de una tabla con una columna calculada y poner la clave principal en esa columna:

CREATE TABLE MyOneRowTable (
    [id] AS (1) PERSISTED NOT NULL CONSTRAINT pk_MyOneRowTable PRIMARY KEY, 
    -- rest of the columns go here 
); 
+0

No sabía acerca de esta característica, ¡gracias! – finnw

+0

Me alegra ayudar. Incluso podría hacer que el valor sea un comentario, por ejemplo '[id] AS ('table_should_only_have_one_row')'. – SQB

4

La manera más limpia (creo) sería un disparador ON INSERT que se produce una excepción (por lo tanto la prevención de la fila de ser insertado). Esto también le da a la aplicación del cliente la oportunidad de recuperarse con gracia.

+1

+1. Me gusta esta solución porque puedo devolver un mensaje de error personalizado que explica por qué la inserción no está permitida. Los mensajes de error generados por las otras soluciones pueden ser confusos. – finnw

1

Uso de Grant Para eliminar los permisos para que cualquiera pueda insertar en la tabla después de añadir la fila

su DBA será capaz de insertar pero el dba sólo debe estar en ejecución cambios de esquema que se comprueban por lo que no debería ser un problema en la práctica

Cuestiones relacionadas