Ограничение / триггер SQL. Можно ли написать ограничение, которое проверяет, «когда вы вставляете запись, она должна содержать одно из двух полей»? - PullRequest
2 голосов
/ 25 августа 2010

Можно ли иметь ограничение / триггер для вводимой записи, которая проверяет, заполнил ли пользователь хотя бы одно из трех полей (все из которых могут быть нулевыми). Например, у меня есть база данных, используемая для отслеживания ошибок и новых функций в других частях программного обеспечения. При обнаружении ошибки создается запись Feature, которая может иметь три внешних ключа: foundID, fixedID или newFeatureID, все три могут быть нулевыми (поскольку это может быть обнаруженная ошибка, исправленная ошибка или новая функция, добавленная в программное обеспечение.), Но пользователь должен выбрать хотя бы один при вводе данных. Я могу контролировать ввод во внешней программе, используя мою базу данных, но если кто-то другой пишет программу, он может не поставить эту проверку на место, поэтому я хочу, чтобы он не делал этого и не вводил поврежденные данные.

Ответы [ 2 ]

3 голосов
/ 25 августа 2010

Используя SQL Server, достаточно добавить Ограничение проверки на уровне таблицы .

CREATE TABLE Bugs (
  discoveredID INTEGER
  , fixedID INTEGER 
  , newFeatureID INTEGER  
  )

ALTER TABLE Bugs ADD CONSTRAINT CKC_AtLeastOne CHECK (COALESCE(discoveredID, fixedID, newFeatureID) IS NOT NULL)

INSERT INTO Bugs VALUES (NULL, NULL, 1)
INSERT INTO Bugs VALUES (NULL, 1, NULL)
INSERT INTO Bugs VALUES (1, NULL, NULL)
INSERT INTO Bugs VALUES (NULL, NULL, NULL) -- Fails

DROP TABLE Bugs
2 голосов
/ 25 августа 2010

Чтение вашего дизайна заставило меня задуматься о том, что, возможно, проблема может заключаться в дизайне таблицы больше, чем в требовании создать ограничение / триггер.

Например, вы упоминаете, что вы можете иметь 3 типа ошибок (обнаруженная ошибка, исправленная ошибка или новая функция)

Возможно ли иметь составной ключ из двух полей, который будет иметь тип ошибки, с соответствующим полем идентификатора рядом с ним.

Так что вместо: foundID, fixedID, newFeatureID

вы бы просто: bugTypeID, BugID

С этим изменением вы можете просто сконцентрироваться на bugTypeID, равном 1,2 или 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...