Répondre

9

Modifier

En fait, je viens de remarquer que vous êtes sur SQL Server 2008, vous pouvez utiliser un index filtré pour cette

CREATE UNIQUE NONCLUSTERED INDEX UIX ON YourTable (col) where col = 1 

Réponse originale

La meilleure façon serait probablement pour stocker ce un pk spécial dans une table à une rangée séparée. L'aspect pas plus d'une ligne peut être appliqué avec des contraintes de vérification.

CREATE TABLE OneRowTable 
(
lock CHAR(1) DEFAULT 'X' NOT NULL PRIMARY KEY CHECK (lock = 'X'), 
OtherTablePK int 
); 

Sinon, vous pourriez avoir en supposant un champ identifiant composé d'entiers positifs que vous pouvez ajouter une colonne calculée avec la définition suivante

case when col=1 then -1 else id end 

et ajoutez une contrainte unique à cette question.

+0

@Tim - Non. L'utilisation des fonctions définies par l'utilisateur dans les contraintes de vérification peut échouer avec les mises à jour multi-lignes et l'isolation des instantanés. J'utiliserais simplement l'approche de l'index filtré. Il s'assurera qu'au plus 1 ligne peut contenir la valeur '1'. Si vous mettez à jour votre question avec votre définition de table, je vais essayer de clarifier ma deuxième suggestion. (Edit: C'était en réponse à votre commentaire précédent qui semble avoir disparu maintenant!) –

+0

ouais, j'ai vérifié cela dans les détails et il est devenu clair. Merci! – Tim

+0

Cela a également pour effet d'accélérer considérablement les requêtes qui impliquent la ligne "active", c'est-à-dire "où col = 1" –