Я хочу разрешить, чтобы в столбец A
можно было вставить только определенное количество значений, и, в зависимости от введенного значения, разрешить вставку в столбец B
только определенного количества значений. Например
Например
- Если A = 1, B может находиться в диапазоне от 1 до 9
- Если A = 2, B может быть между 10 и 19
- Если A = 3, B может быть между 20 и 29
Как мне этого добиться?
Я решил, что проверочные ограничения - лучшее место для начала. Простое ограничение гарантирует, что в столбец A
могут быть добавлены только значения 1-3. Такие как:
CREATE TABLE dbo.test (
col_a INT,
col_b INT,
CONSTRAINT ch_col_a_valid_range CHECK (col_a BETWEEN 1 AND 3)
)
GO
Затем я предположил, что используя скалярную функцию, чтобы определить, является ли col_b
допустимым, передав значение из col_a
и col_b
.
CREATE FUNCTION dbo.value_is_valid (
@a INT,
@b INT
)
RETURNS BIT
AS
BEGIN
IF (@a = 1 AND @b BETWEEN 1 AND 9) RETURN 1;
IF (@a = 2 AND @b BETWEEN 10 AND 19) RETURN 1;
IF (@a = 3 AND @b BETWEEN 20 AND 29) RETURN 1;
RETURN 0;
END
GO
Затем добавьте ограничение к таблице и вызовите функцию как часть проверки.
CREATE TABLE dbo.test (
col_a INT,
col_b INT,
CONSTRAINT ch_col_a_valid_range CHECK (col_a BETWEEN 1 AND 3),
CONSTRAINT ch_col_b_valid_based_on_a CHECK(dbo.value_is_valid(col_a, col_b) = 1)
)
GO
Однако следующая вставка завершается неудачно, из-за чего возникает конфликт с добавленным ограничением ch_col_b_valid_based_on_a
.
INSERT INTO dbo.test (
col_a,
col_b
)
VALUES (1, 9)
Оператор INSERT конфликтовал с ограничением CHECK "ch_col_b_valid_based_on_a". Конфликт произошел в базе данных «MyDB», таблица «dbo.test».
Что я могу сделать, чтобы обойти это и достичь результата, упомянутого выше?
Оглядываясь назад, этот подход использования скалярной функции в проверочном ограничении работает точно так, как ожидалось.