2010-05-18 4 views
5

Quel est le moyen le plus propre de contraindre une table SQL à ne pas avoir plus d'une ligne?Contraindre une table à n'avoir qu'une seule ligne

This related question explique pourquoi une telle table peut exister, mais pas comment la contrainte doit être implémentée. Jusqu'ici, j'ai seulement trouvé des hacks impliquant une colonne de clé unique qui est contrainte à avoir une valeur spécifique, par ex. ALWAYS_0 TINYINT NOT NULL PRIMARY KEY DEFAULT (0) CONSTRAINT CHECK_ALWAYS_0 CHECK (ALWAYS_0 = 0). Je suppose qu'il y a probablement une façon plus propre de le faire.

La solution idéale serait SQL portable, mais une solution spécifique à MS SQL Server ou postgres serait également utile

Répondre

1

Je viens de résoudre le même problème sur SQL Server 2008 en créant une table avec une colonne calculée et de mettre la clé primaire sur cette colonne:

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

Je ne connaissais pas cette fonctionnalité, merci! – finnw

+0

Content de vous aider. Vous pouvez même faire un commentaire, par exemple '[id] AS ('table_should_only_have_one_row')'. – SQB

4

La façon la plus propre (je pense) serait un déclencheur ON INSERT qui lance une exception (empêchant ainsi la rangée d'être inséré). Cela donne également une chance à l'application cliente de récupérer gracieusement.

+1

+1. J'aime cette solution parce que je peux retourner un message d'erreur personnalisé qui explique pourquoi l'insertion n'est pas autorisée. Les messages d'erreur générés par les autres solutions peuvent être source de confusion. – finnw

1

Utilisez Grant pour supprimer les autorisations pour quiconque d'insérer dans la table après avoir ajouté une ligne

Votre dba sera en mesure d'insérer, mais le dba ne devrait être en cours d'exécution des changements de schéma qui sont cochés ne devrait donc pas être un problème dans la pratique

Questions connexes