Определите уникальное ограничение между комбинациями в 2 столбцах и третьем столбце - PullRequest
0 голосов
/ 10 сентября 2018

В приведенной ниже таблице (colA, colB, colC) является первичным ключом.В colD я определил новый тип идентификатора, который уникален для каждой комбинации (colA, colB), а именно:

colD = f (colA, colB)

, так что (A,1) должен дать мне id_1, (B, 2) соответствует id_2 и т. Д., Где идентификаторы являются целочисленными значениями.В приведенной ниже таблице показана ошибка, в которой для (A, 1) существует 2 идентификатора - id_1 и id_2.

Я хотел бы применить ограничение, согласно которому каждая пара значений (colA, colB) отображается на одно и толькоодно значение в colD.Конечно, я могу добавить уникальное ограничение для (colA, colB, colC, colD), потому что (colA, colB, colC) является первичным ключом, но это не обнаружит изменения colC и colD одновременно.

IЯ не уверен, что лучший способ здесь.

 +colA + colB + colC + colD +
 +--------------------------+
 | A   |  1   |180901| id_1 |
 | A   |  1   |180902| id_1 |
 | A   |  1   |180903| id_1 |
 | A   |  1   |180904| id_2 |
 | .   |  .   |  .   |  .   |
 | .   |  .   |  .   |  .   |
 | .   |  .   |  .   |  .   |
 |     |      |      |      |
 |     |      |      |      |
 |     |      |      |      |
 |     |      |      |      |

1 Ответ

0 голосов
/ 10 сентября 2018

Вы можете применить это ограничение, используя индексированное представление:

create table dbo.T (colA char(1) not null, colB int not null,
colC int not null, colD varchar(6) not null,
constraint PK_T PRIMARY KEY (colA,colB,colC))
go
create view dbo.DRI_T
with schemabinding
as
    select colA,colB,colD,COUNT_BIG(*) as Cnt
    from dbo.T
    group by colA,colB,colD
go
create unique clustered index IX_DRI_T on dbo.DRI_T (colA,colB)
go
insert into T(colA,colB,colC,colD)
values ('A',1,180901,'id_1')
go
insert into T(colA,colB,colC,colD)
values ('A',1,180902,'id_1')
go
insert into T(colA,colB,colC,colD)
values ('A',1,180903,'id_1')
go
insert into T(colA,colB,colC,colD)
values ('A',1,180904,'id_2')
go

Ошибка этого четвертого оператора вставки:

Msg 2601, Level 14, State 1, Line 23
Cannot insert duplicate key row in object 'dbo.DRI_T' with unique index 'IX_DRI_T'. The duplicate key value is (A, 1).
The statement has been terminated.

Надеюсь, вы увидите, как работает эта ошибка. Конечно, это не то же самое, что прямое нарушение ограничений, но я думаю, что в нем содержится достаточно информации, и я был бы рад использовать это в одной из моих БД.

И, конечно, вы можете выбрать гораздо лучшие имена для DRI_T и IX_DRI_T, если хотите сделать ошибку более очевидной. Например. IX_DRI_T_colD_mismatch_colA_colB

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