Столбец ссылается на себя.
Таким образом, добавление самой строки гарантирует, что есть соответствующая строка.Это ограничение никогда не может выйти из строя.
Фактически, глядя на план выполнения, SQL Server осознает это и даже не беспокоится о его проверке.Оператор assert
отсутствует.
Если мы создадим более типичную таблицу Employee, существуют другие планы для вставок, которые могут нарушить ограничениекак показано ниже.
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*/
Если вы попробуете несколько строк, блокирующая шпуля будет добавлена в план, чтобы ограничения не возникалине проверяется, пока не будут вставлены все строки.
insert into EMP2 values (3,2),(4,3) /*Can violate constraint - multiple rows*/
И только для полноты, как это было поднято в комментариях, глядя на случай, когдавставка в таблицу с FK, ссылающимся на другую ...
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)
В этом случае в план не добавляется катушка, которую он может проверить, поскольку он вставляет каждую строку, а не все в конце, так чтоон может выполнить откат раньше в случае сбоя строки (конечный результат будет таким же)