我是一个新手,我正在尝试使用xampp for linux 1.8.1创建一个mysql数据库。
我想在两个表A和B之间建立关系。我知道外键创建一个双射或一对一的关系。我不能有这么严格的关系,所以我只在表A中创建了一个存储表B的id的列。
这是对的吗?没有办法强制执行它?我的意思是,这样你就可以删除表A中引用的一行表B. 你可以在A中存储一个值,该值不对应于任何B行的id 。如何防止这种情况?
答案 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。