如何在没有外键的情况下建立两个表之间的关系

时间:2013-05-10 08:57:14

标签: mysql foreign-keys relationship

我是一个新手,我正在尝试使用xampp for linux 1.8.1创建一个mysql数据库。

我想在两个表A和B之间建立关系。我知道外键创建一个双射或一对一的关系。我不能有这么严格的关系,所以我只在表A中创建了一个存储表B的id的列。

这是对的吗?没有办法强制执行它?我的意思是,这样你就可以删除表A中引用的一行表B. 你可以在A中存储一个值,该值不对应于任何B行的id 。如何防止这种情况?

2 个答案:

答案 0 :(得分:1)

我认为你总是需要this的主键,或者你写一个触发器,当发生变化时检查B中ID的一致性。 我不知道没有触发器或约束就可能......

答案 1 :(得分:1)

  

对我来说,主要问题是如果行ID被表A的一行引用,则阻止删除一行表B.

create table table_b (
  b_id integer primary key
);

create table table_a (
  b_id integer primary key references table_b (b_id)
);

insert into table_b values (1);
insert into table_a values (1);

以下陈述将失败。

delete from table_b where b_id = 1;

如果您使用PostgreSQL构建它,则会显示错误消息

  

错误:表“table_b”上的更新或删除违反了表“table_a”上的外键约束“table_a_b_id_fkey”详细信息:仍然从表“table_a”引用了键(b_id)=(1)。

该结构为您提供了两个表之间的“1到0或1”关系。对于“1到0或许多”,将一个或多个列添加到table_a的主键。

create table table_b (
  b_id integer primary key
);

create table table_a (
  b_id integer references table_b (b_id),
  checkout_date date not null default current_date,
  primary key (b_id, checkout_date)
);

该结构将允许table_a为b_id的一个值存储多行,但每个行必须具有不同的checkout_date。