我是一个新手,我正在尝试使用 xampp for linux 1.8.1 做一个 mysql 数据库。
我想在两个表 A 和 B 之间建立关系。据我所知,外键创建双射或一对一关系。我一定没有这么严格的关系,所以我只在表 A 中创建了一个列来存储表 B 的 id。
这个对吗?没有办法强制执行吗?我的意思是,这样你可以删除表 A 中引用的表 B 的一行。 你可以在 A 中存储一个与 B 的任何行的 id 不对应的值。如何防止这种情况发生?
我是一个新手,我正在尝试使用 xampp for linux 1.8.1 做一个 mysql 数据库。
我想在两个表 A 和 B 之间建立关系。据我所知,外键创建双射或一对一关系。我一定没有这么严格的关系,所以我只在表 A 中创建了一个列来存储表 B 的 id。
这个对吗?没有办法强制执行吗?我的意思是,这样你可以删除表 A 中引用的表 B 的一行。 你可以在 A 中存储一个与 B 的任何行的 id 不对应的值。如何防止这种情况发生?
我认为您总是需要一个主键,或者您编写一个触发器,当发生更改时检查来自 B 的 ID 的一致性。我不知道没有触发器或约束是可能的......
对我来说,主要问题是如果行 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。