#sql-server #tsql #triggers #constraints #gaps-in-data
#sql-сервер #tsql #раздражители #ограничения #пробелы в данных
Вопрос:
У меня есть таблица идентификаторов, IntervalFrom
и IntervalTo
:
Идентификатор | Интервал между | ИнтервалТо |
---|---|---|
1 | 0 | 2 |
1 | 2 | 4 |
2 | 0 | 2 |
2 | 2 | 4 |
У меня уже есть триггер, который НЕ позволяет интервалам перекрываться.
Я ищу триггер или ограничение, которое не допустит пробелов в данных. У меня есть поиск, и информация, которую я нашел, относится к пробелам в запросах и данных, а не к тому, чтобы не допускать их в первую очередь. Я не могу найти ничего в связи с этим в качестве триггера или ограничения.
Возможно ли это с помощью T-SQL?
Заранее спасибо.
Комментарии:
1. В соответствии с руководством по вопросам, пожалуйста, покажите, что вы пробовали, и расскажите нам, что вы нашли (на этом сайте или где-либо еще) и почему это не соответствовало вашим потребностям.
2. Речь идет не о поиске точного решения вашей проблемы, а о разработке подхода, а затем о поиске компонентов, которые позволят вам реализовать ваш подход, например, если вы найдете запрос, который обнаруживает пробелы, вы можете использовать его в триггере и выдать ошибку, если обнаружен пробел. Существуют учебные пособия по созданию триггеров и учебные пособия по обнаруженным пробелам.
3. Но [0, 2] перекрывается с [2, 4]
Ответ №1:
Вы можете создать таблицу, которая автоматически защищена от перекрытий и пробелов:
create table T ( ID int not null, IntervalFrom int null, IntervalTo int null, constraint UQ_T_Previous_XRef UNIQUE (ID, IntervalTo), constraint UQ_T_Next_XRef UNIQUE (ID, IntervalFrom), constraint FK_T_Previous FOREIGN KEY (ID, IntervalFrom) references T (ID, IntervalTo), constraint FK_T_Next FOREIGN KEY (ID, IntervalTo) references T (ID, IntervalFrom) ) go create unique index UQ_T_Start on T (ID) where IntervalFrom is null go create unique index UQ_T_End on T(ID) where IntervalTo is null go
Обратите внимание, что для этого требуется несколько иное соглашение для первого и последнего интервалов — они должны использоваться null
вместо 0
или (несколько произвольно) 4
.
Обратите также внимание, что изменение данных в такой таблице может быть сложной задачей — если вы вставляете новый интервал, вам также необходимо обновить другие интервалы, чтобы учесть новый. MERGE
здесь твой друг.
Учитывая вышесказанное, мы можем вставить ваши (измененные) данные образца:
insert into T (ID, IntervalFrom, IntervalTo) values (1,null,2), (1,2,null), (2,null,2), (2,2,null) go
Но мы не можем вставить перекрывающееся значение (это ошибка).:
insert into T(ID, IntervalFrom, IntervalTo) values (1,1,3)
Вы также должны видеть, что внешние ключи предотвращают существование пробелов в последовательности