插入不匹配的client与VIN到service表未按预期报错的原因是什么
问题原因
当前service表的两个外键是独立校验的:
fk_client的外键仅校验传入的客户ID是否在cars表的fk_client列存在,ID为1的客户在cars表存在对应记录,所以校验通过fk_vin的外键仅校验传入的VIN是否在cars表的vin列存在,2234在cars表存在对应记录,所以校验通过
两个外键没有绑定关联校验,自然不会触发你预期的匹配校验逻辑。
解决方案
你可以通过给service表添加联合外键约束实现校验,要求(fk_client, fk_vin)的组合必须在cars表的(fk_client, vin)列中存在对应匹配的记录。
修改service表的创建语句如下:
create table service ( id BIGSERIAL primary key, fk_client BIGSERIAL, fk_vin VARCHAR(20), -- 替换原独立外键为联合外键 FOREIGN KEY(fk_client, fk_vin) references cars(fk_client, vin) );
修改后再执行测试插入语句insert into service (fk_client, fk_vin) values (1,'2234');就会触发外键约束报错,符合你的预期。
内容的提问来源于stack exchange,提问作者fredx
相关产品推荐
相关产品推荐

