La colonne se référence elle-même.
Ainsi, l'ajout de la ligne elle-même garantit qu'il existe une ligne correspondante. Cette contrainte ne peut jamais échouer.
En fait, en regardant le plan d'exécution, SQL Server s'en rend compte et ne prend même pas la peine de le vérifier. Il n'y a pas de assert
opérateur présent.
Si nous créons une table Employé plus typique, il existe différents plans pour les insertions qui peuvent violer la contrainte comme ci-dessous.
create table EMP2(Eid int primary key, boss_id int null);
alter table EMP2 add constraint fk_EMP2_Eid
foreign key (boss_id) references EMP2(Eid)
insert into EMP2 values(1,null) /*Can't violate constraint as NULL*/
insert into EMP2 values(2,1) /*Can violate constraint as NOT NULL*/
Si vous essayez plusieurs rangées d'un bobine de blocage est ajouté au plan afin que les contraintes ne soient pas vérifiées avant que toutes les lignes soient insérées.
insert into EMP2 values (3,2),(4,3) /*Can violate constraint - multiple rows*/
Et juste pour être complet, comme cela a été soulevé dans les commentaires, en regardant le cas où l'insertion est dans une table avec un FK faisant référence à une autre table...
CREATE TABLE EmpSalaryHistory
(
Eid INT NOT NULL REFERENCES EMP(Eid),
EffectiveDate DATETIME NOT NULL,
Salary INT,
PRIMARY KEY (Eid,EffectiveDate)
)
INSERT INTO EmpSalaryHistory
VALUES (1,GETDATE(),50000),
(2,GETDATE(),50000)
Dans ce cas, aucun spool n'est ajouté au plan, il peut vérifier l'insertion de chaque ligne plutôt que de tout insérer à la fin, ce qui lui permet de revenir en arrière plus tôt en cas d'échec d'une ligne (le résultat final sera le même).