sql - 如何将一个表中的多个外键引用到 ms sql 中的单个主键
问题描述
我试过这个查询,但它不起作用。说我必须使用 ON DELETE NO ACTION,但我需要为已删除的引用设置 null
CREATE TABLE airports
(
id integer primary key identity(1,1),
country varchar(50) not null,
city varchar(50) not null,
airport_name varchar(50) not null,
airport_class varchar(50) not null
);
CREATE TABLE flights
(
id integer primary key identity(1,1),
code integer unique not null,
departure_point integer,
arrival_point integer,
departure_time datetime not null,
arrival_time datetime not null,
foreign key(departure_point) references airports(id) on delete set null,
foreign key(arrival_point) references airports(id) on delete set null
);
错误(它是俄语,抱歉)
Введение ограничения внешнего ключа (FOREIGN KEY) "FK__flights__arrival__286302EC" для таблицы "flights" может привести к появлению циклов или множественных каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION либо измените другие ограничения внешнего ключа (FOREIGN KEY).
解决方案
这是一个有点长的评论。
我认为这在 SQL Server 中是不可能的。不幸的是,SQL Server 只允许set null
每个外部表引用一个。
也就是说,您可能还有其他选择:
- 我不确定
flights
与NULL
机场合作是否真的有用。您可能想要删除整行。 - 如果您愿意,您可以将航班信息存储在存档表中,其中包含
NULL
值或无效的外键引用。 - 您可以软删除机场。只要有一个机场是否活跃的标志。
推荐阅读
- vb.net - 如何在 DataGridView 中的行之间绘制垂直线?
- flutter - 如何将小部件自己的数据传递给函数
- python-3.x - 在 Python 中创建服务包装器
- testng - 如何使用同一 Testng 类中定义的 1 个数据提供程序并行运行单个 @Test 方法
- javascript - 如何有条件地增加值?
- java - 将值映射到实体中缺少的 DTO
- terraform - 无法对我的 terraform 模块设置条件
- swift - 由于未声明的类型,如何将代码转换为 Swift 4?
- azure-application-insights - 监控 Azure Application Insight 数据摄取
- promise - axios拦截器:如何在onFulfill中抛出错误?