У меня есть таблица конфигурации в моей базе данных SQL Server, и эта таблица должна иметь только одну строку. Чтобы помочь будущим разработчикам понять это, я бы хотел предотвратить добавление нескольких строк данных. Я решил использовать триггер для этого, как показано ниже ...
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
Это не выдает ошибку, но не позволяет войти в первую строку.
Также существует ли более эффективный / более понятный способ ограничения числа строк, которые могут быть вставлены в таблицу, до 1, чем этот? Мне не хватает встроенной функции SQL Server?
Ответы:
Эти два ограничения будут делать:
Вам нужно и
PRIMARY KEY
(илиUNIQUE
ограничение), чтобы никакие две строки не имели одинаковоеID
значение, иCHECK
ограничение, чтобы все строки имели одинаковоеID
значение (произвольно выбранный1
).В сочетании два почти противоположных ограничения ограничивают количество строк либо нулем, либо единицей.
В вымышленной СУБД (текущая реализация SQL не позволяет такую конструкцию), которая допускает первичный ключ, состоящий из 0 столбцов, это тоже будет решением:
источник
Вы можете определить идентификатор как вычисляемый столбец с постоянным значением и объявить этот столбец уникальным:
источник
Вы также можете использовать триггер ..
источник
Кажется немного странным требованием, но хо-хум :) Вы могли бы просто иметь ограничение на таблицу и затем разрешать только обновления (без вставки или удаления) таблицы?
Хотя это немного хакерский способ, не лучше ли просто принудительно вносить изменения в конфигурацию с помощью хранимой процедуры, которая затем может обработать всю эту логику для вас?
источник
ID
иметь значение0
или отрицательное. И, как указывает @Mat, произойдет сбой, если вы попытаетесь вставить другую строку, если первая будет удалена.INSERT INTO dbo.Config DEFAULT VALUES;
один раз, но вы можете выполнить егоSET IDENTITY_INSERT dbo.Config ON; INSERT INTO dbo.Config (ID) VALUES (0); SET IDENTITY_INSERT dbo.Config OFF;
много раз, и в результате вы получите таблицу из нескольких строк.