Я хочу разрешить вставку только определенного количества значений в столбец A
и, в зависимости от введенного значения, разрешить вставку только определенного количества значений в столбец B
. Например
Например
- Если A = 1, B может быть между 1 и 9
- Если A = 2, B может быть между 10 и 19
- Если A = 3, B может быть между 20 и 29
Как я могу этого добиться?
Я решил, что контрольные ограничения — лучшее место для начала. Простое ограничение гарантирует, что только значения 1-3 могут быть добавлены в столбец A
. Такие как:
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".
Что я могу сделать, чтобы обойти это и достичь результата, упомянутого выше?
Оглядываясь назад, этот подход с использованием скалярной функции в проверочном ограничении работает точно так, как ожидалось.