J'ai une table de configuration dans ma base de données SQL Server et cette table ne doit avoir qu'une seule ligne. Pour aider les futurs développeurs à comprendre cela, j'aimerais empêcher l'ajout de plusieurs lignes de données. J'ai choisi d'utiliser un déclencheur pour cela, comme ci-dessous ...
ALTER TRIGGER OnlyOneConfigRow
ON [dbo].[Configuration]
INSTEAD OF INSERT
AS
BEGIN
DECLARE @HasZeroRows BIT;
SELECT @HasZeroRows = CASE
WHEN COUNT (Id) = 0 THEN 1
ELSE 0
END
FROM
[dbo].[Configuration];
IF EXISTS(SELECT [Id] FROM inserted) AND @HasZeroRows = 0
BEGIN
RAISERROR ('You should not add more than one row into the config table. ', 16, 1)
END
END
Cela ne génère pas d'erreur mais ne permet pas à la première ligne d'entrer.
Existe-t-il également un moyen plus efficace / plus explicite de limiter le nombre de lignes pouvant être insérées dans une table à seulement 1? Suis-je en train de manquer une fonctionnalité SQL Server intégrée?
Réponses:
Ces deux contraintes feraient:
Vous avez besoin à la fois de la
PRIMARY KEY
(ou d'uneUNIQUE
contrainte) pour que deux lignes n'aient pas la mêmeID
valeur et de laCHECK
contrainte pour que toutes les lignes aient la mêmeID
valeur (choisie arbitrairement1
).En combinaison, les deux contraintes presque opposées limitent le nombre de lignes à zéro ou à un.
Sur un SGBD fictif (aucune implémentation SQL actuelle ne permet cette construction) qui autorise une clé primaire composée de 0 colonnes, ce serait aussi une solution:
la source
Vous pouvez définir l'ID comme une colonne calculée évaluant une valeur constante et déclarer cette colonne comme unique:
la source
Vous pouvez également utiliser le déclencheur.
la source
Semble un peu une exigence étrange mais ho-hum :) Vous pourriez simplement avoir une contrainte sur la table et ensuite autoriser uniquement les mises à jour (pas d'insertion ou de suppression) de la table?
C'est un peu un moyen hackey de le faire, ne serait-il pas préférable d'appliquer simplement des changements à la configuration via une procédure stockée qui peut alors gérer toute cette logique pour vous?
la source
ID
d'avoir une valeur0
ou une valeur négative. Et en tant que points @Mat, il échouera si vous essayez d'insérer une autre ligne si la première est supprimée.INSERT INTO dbo.Config DEFAULT VALUES;
une seule fois, mais vous pouvez la suivreSET IDENTITY_INSERT dbo.Config ON; INSERT INTO dbo.Config (ID) VALUES (0); SET IDENTITY_INSERT dbo.Config OFF;
plusieurs fois et vous vous retrouverez avec un tableau à plusieurs lignes.