как сделать ограничение, на создание новых записей sql

Рейтинг: 0Ответов: 1Опубликовано: 29.05.2023

Допустим у меня есть таблицы Призеры, Спортсмены, Соревнования, как мне мне сделать, чтобы в таблице Призеры можно было создать только 3 записи каждого соревнования, то есть 3 колонки, id соревнования, id спортсмена и место

Ответы

▲ 1

Как вариант ограничения числа записей предложу следующий вариант (SQL Server).

CREATE TABLE CheckTbl (col0 int,col1 int, col2 int);  
create unique index uIdx1 on CheckTbl (col0,col2);
ALTER TABLE CheckTbl  
ADD CONSTRAINT chkCol1ValueMin CHECK (col2 >= 1 );  

ALTER TABLE CheckTbl  
ADD CONSTRAINT chkCol1ValueMax CHECK (col2 <= 3 );  

В примере col0 соответствует вашему Id соревнования, col1 - Id спортсмена, col2 - место. Создаем ограничение-уникальный индекс (col0,col2) и ограничения от 1 до 3 по величине col2. Пробуем

insert into CheckTbl values (1,11,1);
insert into CheckTbl values (1,12,2);
insert into CheckTbl values (1,13,3);
insert into CheckTbl values (1,14,4);
insert into CheckTbl values (1,15,3);
insert into CheckTbl values (1,16,0);
Update CheckTbl set col2=5 where col0=1 and col1=13;

Первые 3 операции пройдут нормально. Следующая вызовет ошибку

Msg 547 Level 16 State 0 Line 4
The INSERT statement conflicted with the CHECK constraint "chkCol1ValueMax".
The conflict occurred in database "fiddle_daf2dfcad6a1416bba8ba6f8669fff72",
 table "dbo.CheckTbl", column 'col2'.

Далее

Msg 2601 Level 14 State 1 Line 5
Cannot insert duplicate key row in object 'dbo.CheckTbl' with unique index 'uIdx1'.
The duplicate key value is (1, 3).

еще проверки

Msg 547 Level 16 State 0 Line 6
The INSERT statement conflicted with the CHECK constraint "chkCol1ValueMin".
The conflict occurred in database "fiddle_daf2dfcad6a1416bba8ba6f8669fff72",
 table "dbo.CheckTbl", column 'col2'.
Msg 547 Level 16 State 0 Line 7

The UPDATE statement conflicted with the CHECK constraint "chkCol1ValueMax".
 The conflict occurred in database "fiddle_daf2dfcad6a1416bba8ba6f8669fff72",
 table "dbo.CheckTbl"
, column 'col2'.

Пример здесь

Upd1. Если нужно ограничение безотносительно значений, думаю, придется применять триггер. Однако в stored proc или в приложении ловить ошибки из триггера очень не нравится.