0

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

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

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

4

2 回答 2

1

我认为您总是需要一个主键,或者您编写一个触发器,当发生更改时检查来自 B 的 ID 的一致性我不知道没有触发器或约束是可能的......

于 2013-05-10T09:19:49.493 回答
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”详细信息:键(b_id)=(1)仍然从表“table_a”中引用。

该结构为您提供了两个表之间的“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。

于 2013-05-10T11:09:51.227 回答