【问题标题】:Attribute referencing two foreign keys引用两个外键的属性
【发布时间】:2020-06-04 20:11:04
【问题描述】:

我在 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”中。

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

【问题讨论】:

  • 可能,是的。但这有意义吗?在大多数情况下,FK 引用另一个表中的主键,该主键通常是整数。 varchar(30) 主键和外键有点不寻常。

标签: sql foreign-keys sql-insert


【解决方案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单个值实际上可能指向两个不同的行一次。这对于 INSERT、UPDATE 和 DELETE 来说可能非常棘手。您看到的错误可能与此副作用有关。修改数据以保持 FK 有效时需要小心。

【讨论】:

    猜你喜欢
    • 2018-02-19
    • 2014-06-04
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 2015-06-04
    相关资源
    最近更新 更多