Sql server Can';t创建外键:可能导致循环

Sql server Can';t创建外键:可能导致循环,sql-server,Sql Server,我在用于管理自定义UI品牌的两个表之间建立了一个非常简单的关系: ui\u门户\u品牌化 CREATE TABLE ui_portal_branding ( id VARBINARY(16) NOT NULL, branding_type VARCHAR(128) NOT NULL, portal_name NVARCHAR(128) NOT NULL, theme_id VARBINARY(16) NOT NULL, portal_logo V

我在用于管理自定义UI品牌的两个表之间建立了一个非常简单的关系:

ui\u门户\u品牌化

CREATE TABLE ui_portal_branding 
(
    id VARBINARY(16) NOT NULL, 
    branding_type VARCHAR(128) NOT NULL, 
    portal_name NVARCHAR(128) NOT NULL, 
    theme_id VARBINARY(16) NOT NULL, 
    portal_logo VARBINARY(16) NULL, 
    portal_favicon VARBINARY(16) NULL, 
    background_color VARCHAR(50) NULL, 
    organization_id VARBINARY(16) NULL, 

    CONSTRAINT pk_ui_port_bran_id PRIMARY KEY (id) 
)
ui\u门户\u资源

CREATE TABLE ui_portal_resource 
( 
    id VARBINARY(16) NOT NULL, 
    mime_type NVARCHAR(128) NOT NULL, 
    binary_data VARBINARY(MAX) NOT NULL, 

   CONSTRAINT pk_ui_port_reso_id PRIMARY KEY (id) 
)
品牌是主表,资源是二进制数据的BLOB存储。品牌表中的
portal_logo
portal_favicon
都是资源表中的可选二进制数据

我想用以下一般逻辑将其定义为外键约束:不需要定义logo或favicon。如果定义了它们,则它们通过
ui\u portal\u resource.id
指向资源表中的记录。如果从资源表中删除了数据,我想将品牌表中的相应列设置为null。我不想禁止资源删除,我不想将删除级联到品牌表

因此,我定义如下:

ALTER TABLE ui_portal_branding 
    ADD CONSTRAINT fk_ui_port_bran2ui_port_reso 
    FOREIGN KEY (portal_logo) REFERENCES ui_portal_resource (id) 
    ON DELETE SET NULL
到目前为止还不错。现在我定义:

ALTER TABLE ui_portal_branding 
    ADD CONSTRAINT fk_ui_port_bran2ui_port_reso2 
    FOREIGN KEY (portal_favicon) REFERENCES ui_portal_resource (id) 
    ON DELETE SET NULL
突然之间,我们遇到了一个问题:

在表“ui\U portal\U branding”上引入外键约束“fk\U ui\U port\U bran2ui\U port\U reso2”可能会导致循环或多个级联路径。指定“在删除时不执行操作”或“在更新时不执行操作”,或修改其他外键约束

在我看来,这似乎是错误的。我不是在介绍一个循环。它是两个表,外键定义在一个方向上。我猜从技术上讲,它可以是多个级联路径——如果同一个资源是favicon和徽标,它必须将2个设置为空。但真的吗?这是SQL Server引擎的交易破坏者?Oracle和Postgres都认为这种情况是可以接受的


这个问题是否有合理的解决办法?我对涉及触发器的解决方案不感兴趣。有没有更好的方法对数据进行建模?我希望resources表能够提供的服务不仅仅是branding表,这导致了当前的FK布局。但也许这是不可能的?

为什么要将两个字段关联到同一个外部字段?我不是,它们是不同的外部字段。logo和favicon都是二进制资源。对同一资源PK使用两个不同的fk似乎完全合理。在许多表中,单个主键可以用作外键。如果FK与另一个FK或不同的表位于同一个表中,为什么每个PK的n个外键应该不同?您是否尝试在表设计器中执行此操作?请查看此处-