95 votes

SQL Server: comment contraindre un tableau pour contenir une seule ligne?

Je veux stocker une seule ligne dans une table de configuration pour mon application. Je voudrais faire valoir ce que de ce tableau peut contenir qu'une seule ligne.

Quelle est la façon la plus simple d'appliquer la ligne de contrainte ?

122voto

Damien_The_Unbeliever Points 102139

Vous assurez-vous que l'une des colonnes ne peut contenir qu'une seule valeur, et puis assurez-vous que la clé primaire (ou appliquer une contrainte d'unicité)

CREATE TABLE T1(
    Lock char(1) not null,
    /* Other columns */,
    constraint PK_T1 PRIMARY KEY (Lock),
    constraint CK_T1_Locked CHECK (Lock='X')
)

J'ai un certain nombre de ces tables dans différentes bases de données, principalement pour le stockage de config. C'est beaucoup plus agréable de savoir que, si la configuration doit être un int, vous ne pourrez jamais lire un int à partir de la DB.

64voto

ACB Points 195

J'ai l'habitude d'utiliser Damien approche, qui a toujours travaillé très bien pour moi, mais j'ai aussi ajouter une chose:

CREATE TABLE T1(
    Lock char(1) not null DEFAULT 'X',
    /* Other columns */,
    constraint PK_T1 PRIMARY KEY (Lock),
    constraint CK_T1_Locked CHECK (Lock='X')
)

En ajoutant le "par DÉFAUT" X"", vous n'aurez plus jamais avoir à traiter avec le Verrou de colonne, et ne pas avoir à vous rappeler quelle était la valeur de verrouillage lors du chargement de la table pour la première fois.

19voto

paxdiablo Points 341644

Vous voudrez peut-être repenser cette stratégie. Dans des situations similaires, je l'ai souvent trouvé inestimable de quitter l'ancienne configuration des lignes situées autour de l'information historique.

Pour ce faire, vous avez réellement une colonne supplémentaire creation_date_time (date/heure de l'insertion ou de mise à jour) et d'un insert ou d'insertion/mise à jour dispositif, ce qui permet de le remplir correctement avec la date/heure actuelle.

Ensuite, afin d'obtenir votre configuration actuelle, vous utilisez quelque chose comme:

select * from config_table order by creation_date_time desc fetch first row only

(en fonction de votre SGBD saveur).

De cette façon, vous obtenez toujours de maintenir l'histoire à des fins de récupération (vous pouvez l'institut procédures de nettoyage si le tableau est trop grand, mais c'est peu probable) et vous obtenez toujours de travailler avec la dernière configuration.

5voto

John Sansom Points 20087

Vous pouvez mettre en œuvre un au LIEU DE Déclencher à appliquer ce type de logique métier dans la base de données.

Le déclencheur peut contenir logique pour vérifier si un enregistrement existe déjà dans la table, et, dans l'affirmative, la RESTAURATION de l'Insert.

Maintenant, en prenant un peu de recul pour regarder le tableau d'ensemble, je me demande si peut-être il y a une alternative et plus appropriée pour vous de stocker cette information, peut-être dans un fichier de configuration ou la variable d'environnement par exemple?

1voto

user3382925 Points 1

J'utilise un champ de bits de clé primaire nom est actif. Il peut donc y avoir 2 lignes au plus, et et le sql pour obtenir la validité de la ligne est: sélectionnez * à partir de Paramètres où est actif = 1 si la table est nommée Paramètres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X