СЖ
Size: a a a
СЖ
M

СЖ
KT
DROP TABLE IF EXISTS t2, t1;
GO
create table dbo.t1 (id int NOT NULL primary key);
insert into t1(id) values (1);
insert into t1(id) values (2);
create table dbo.t2 (
id int NOT NULL primary key
, t1_id int NULL CONSTRAINT FK_t2_t1_id REFERENCES t1(id)
, name_check varchar(100) NULL
);
ALTER TABLE dbo.t2 ADD CONSTRAINT CKT_t2_t1_id
CHECK( CASE WHEN t1_id IS NULL AND name_check = 'required' THEN 0 ELSE 1 END = 1);
/* success */
insert into t2(id, t1_id, name_check) values (1, 1, NULL);
insert into t2(id, t1_id, name_check) values (2, NULL, NULL);
insert into t2(id, t1_id, name_check) values (3, 2, NULL);
insert into t2(id, t1_id, name_check) values (4, NULL, 'not required');
/*
Msg 547, Level 16, State 0, Line 21
The INSERT statement conflicted with the CHECK constraint "CKT_t2_t1_id". The conflict occurred in database "master", table "dbo.t2"
*/
insert into t2(id, t1_id, name_check) values (5, NULL, 'required');
M
СЖ
M
A
DROP TABLE IF EXISTS t2, t1;
GO
create table dbo.t1 (id int NOT NULL primary key);
insert into t1(id) values (1);
insert into t1(id) values (2);
create table dbo.t2 (
id int NOT NULL primary key
, t1_id int NULL CONSTRAINT FK_t2_t1_id REFERENCES t1(id)
, name_check varchar(100) NULL
);
ALTER TABLE dbo.t2 ADD CONSTRAINT CKT_t2_t1_id
CHECK( CASE WHEN t1_id IS NULL AND name_check = 'required' THEN 0 ELSE 1 END = 1);
/* success */
insert into t2(id, t1_id, name_check) values (1, 1, NULL);
insert into t2(id, t1_id, name_check) values (2, NULL, NULL);
insert into t2(id, t1_id, name_check) values (3, 2, NULL);
insert into t2(id, t1_id, name_check) values (4, NULL, 'not required');
/*
Msg 547, Level 16, State 0, Line 21
The INSERT statement conflicted with the CHECK constraint "CKT_t2_t1_id". The conflict occurred in database "master", table "dbo.t2"
*/
insert into t2(id, t1_id, name_check) values (5, NULL, 'required');
Р
К
Р
К
Р
К
К
Р
К
Р
NZ
