引用两个外键的属性

问题描述 投票:1回答:1

我在SQL中创建了一个这样的表

create table  WEATHER_STATION.Humidade 
(
    valor_observado int ,
    data_observacao date ,
    unidade_medida varchar(15),
    id_observacao int identity(1,1) primary key,
    estacao varchar(30) 
    foreign key (estacao) references WEATHER_STATION.Pessoa_singular(estacao_nome),
    foreign key (estacao) references WEATHER_STATION.Estaçao_meteorologica(localidade)
)

然后,我用这个代码插入值。

INSERT INTO WEATHER_STATION.Humidade 
VALUES (83,'2020-01-24','%','Albergaria(amadora)')

INSERT INTO WEATHER_STATION.Humidade 
VALUES (83,'2020-01-23','%','Aveiro')

两种情况下,我都得到了这个错误。

INSERT 语句与 FOREIGN KEY 约束 "FK__Humidade__estaca__00CA12DE "冲突。冲突发生在数据库 "p4g8",表 "WEATHER_STATION.Estaçao_meteorologica",列 "localidade"。

INSERT 语句与 FOREIGN KEY 约束 "FK__Humidade__estaca__7FD5EEA5 "发生冲突。冲突发生在数据库 "p4g8",表 "WEATHER_STATION.Pessoa_singular",列 "estacao_nome"。

我的问题是:是否有可能一个属性引用两个来自不同表的外键?

sql foreign-keys sql-insert
1个回答
1
投票

它当然可以。

但是你的表达方式是误导性的。一个列不会 "指向 "另一个表。一个外键将一个表的列与另一个表的键 "关联 "起来。当一个列是 相关 到一个外表上的多个键,我称它们为 "分叉外键",但这只是我的看法。

考虑下面的例子。

create table a (
  b int primary key not null,
  c int unique not null
);

create table d (
  e int,
  f int,
  constraint fk1 foreign key (e) references a (b),
  constraint fk2 foreign key (e) references a (c),
  constraint fk3 foreign key (f) references a (b),
  constraint fk4 foreign key (f) references a (c)
);

在这个例子中,你有四个外键,有两列。使用你的 "点 "行话,你可以说。

  • e -> b
  • e -> c
  • f -> b
  • f -> c

所以 e 分两次,并 f 点也是两次。另外 bc 是指每个人两次。

最后,一个有趣的副作用是,由于 e 两次指着桌子 a单值 其实可能指向 两行 同时进行。这对于INSERTs、UPDATEs和DELETEs来说可能非常棘手。你看到的错误可能与这个副作用有关。你需要在修改数据时小心翼翼地保持FKs的有效性。

© www.soinside.com 2019 - 2024. All rights reserved.