Vérifiez les contraintes ne peuvent pas référencer directement d'autres lignes données. Certaines techniques tentent d'utiliser les fonctions définies par l'utilisateur pour contourner cette limitation, mais elles ont tendance à ne pas fonctionner correctement. Surtout dans ce cas où je présume que l'insertion de la rangée 4 devrait également être bloquée si elle avait un bowlerID de 165
puisque cela signifierait que 2 & overs partageait un melon. Au lieu de cela, nous pouvons implémenter ceci avec une paire de vues. Je place habituellement DRI quelque part au nom de vues comme ceci pour indiquer qu'elles sont là pour des raisons d'intégrité référentielle déclarative, pas parce que j'ai l'intention de les interroger.
create table dbo.Bowling (
ID int not null,
OverNumber int not null,
BowlerID int not null,
InningsID int not null,
constraint PK_Bowling PRIMARY KEY (ID),
constraint UQ_Bowling_Overs UNIQUE (OverNumber,InningsID)
)
go
create view dbo.Bowling_DRI_SuccessiveOvers_Odd
with schemabinding
as
select
(OverNumber/2) as OddON,
BowlerID
from
dbo.Bowling
go
create unique clustered index UQ_Bowling_DRI_SuccessiveOvers_Odd on dbo.Bowling_DRI_SuccessiveOvers_Odd (OddON,BowlerID)
go
create view dbo.Bowling_DRI_SuccessiveOvers_Even
with schemabinding
as
select
((OverNumber+1)/2) as EvenON,
BowlerID
from
dbo.Bowling
go
create unique clustered index UQ_Bowling_DRI_SuccessiveOvers_Even on dbo.Bowling_DRI_SuccessiveOvers_Even (EvenON,BowlerID)
go
insert into dbo.Bowling(ID,OverNumber,BowlerID,InningsID) values
(1,1,150,1),
(2,4,160,1),
(3,3,165,1)
go
insert into dbo.Bowling(ID,OverNumber,BowlerID,InningsID) values
(4,2,150,1)
Cet insert final génère l'erreur:
Msg 2601, Level 14, State 1, Line 37 Cannot insert duplicate key row in object 'dbo.Bowling_DRI_SuccessiveOvers_Even' with unique index 'UQ_Bowling_DRI_SuccessiveOvers_Even'. The duplicate key value is (1, 150). The statement has been terminated.
Si tout va bien, vous pouvez voir l'astuce j'employer pour faire ces vues vérifier votre contrainte souhaitée - il est mis en place afin que les lignes sont jumelés avec soit leur successeur (logique, basé sur OrderNumber
) ou son prédécesseur en divisant le OrderNumber
par deux en utilisant des maths entiers. Nous appliquons ensuite des contraintes uniques sur ces paires et notamment BowlerID
. Ce n'est que si le même bouliste bols deux overs successifs que nous générons plus d'une ligne avec les mêmes valeurs (OddON
/EvenON
) et BowlerID
.
Vous devez le mettre dans une fonction - la fonction doit renvoyer le dernier identifiant melon de votre table et dans la contrainte vous venez de vérifier s'il est différent de l'identifiant melon que vous voulez insérer – PacoDePaco
qui fonctionnent? Pouvez-vous s'il vous plaît expliquer un peu. Parce que je suis nouveau dans Sql et je ne sais pas beaucoup –
S'il vous plaît lire ma table à nouveau. Il n'est pas nécessaire que les Overs soient ajoutés consécutivement dans la base de données. Dans la deuxième rangée OverNumber est 4 –