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

Mysql 如何在没有外键的情况下建立两个表之间的关系,mysql,foreign-keys,relationship,Mysql,Foreign Keys,Relationship,我完全是个新手,我正在尝试使用xampp for Linux1.8.1创建一个mysql数据库 我想在两个表a和B之间建立一个关系。据我所知,外键创建一个双射,或一对一关系。我不能有这样严格的关系,所以我只在表a中创建了一个列来存储表B的id 这是正确的吗?没有办法强制执行吗?我的意思是,通过这种方式,您可以删除表a中引用的表B中的一行。您可以在a中存储一个与B中任何一行的id都不对应的值。如何防止这种情况?我认为您始终需要一个primarykey,或者您可以编写一个触发器,在发生更改时检查B中

我完全是个新手,我正在尝试使用xampp for Linux1.8.1创建一个mysql数据库

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


这是正确的吗?没有办法强制执行吗?我的意思是,通过这种方式,您可以删除表a中引用的表B中的一行。您可以在a中存储一个与B中任何一行的id都不对应的值。如何防止这种情况?

我认为您始终需要一个primarykey,或者您可以编写一个触发器,在发生更改时检查B中id的一致性。 我不知道如果没有触发器或约束,这是可能的

我的主要问题是,如果表a的行引用了行id,则无法删除表B的行

下面的语句将失败

delete from table_b where b_id = 1;
如果是用PostgreSQL构建的,错误消息会说

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

该结构为您提供了两个表之间的“1到0或1”关系。对于“1到0或多个”,将一个或多个列添加到表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)
);

该结构将允许表a为一个b_id值存储多行,但这些行中的每一行都必须有不同的签出日期。

与其直接使用SQL语句更新表,不如编写一个存储过程,如果它没有创建孤立项,就添加字段。但是,如果你能给出你到底想做什么/存储什么的细节(可能还有一个sql小提琴),我可以给出更多help@Mark:好的,我问错问题了。我的主要问题是,如果表a的某一行引用了表B的某一行id,则阻止删除该行。我将更新该问题。后续:我没有添加示例,因为我不了解通常执行此操作的正确方法。引用“据我所知,外键创建双射或一对一关系。”这是错误的,外键在1:1、1:N和N:N中使用relations@Tiago阿尔梅达:谢谢你,更正了。我更新了问题,查看了它和/或我对问题的第一次评论。所以我要做的就是把它弄对。您的意思是,如果您删除了表a中的一行,您想阻止删除表B中的“关联”行吗?完全正确,并且要防止反转。是的!PS:我以前被冤枉过,这种逆转既不需要也不值得欣赏。。。我在这个问题上搞得一团糟:(它很有效。我似乎不太了解外键,因为我认为它们会创建一个双射。非常感谢!PS:mysql是非标准的,所以需要分开一个外键子句。内联“引用”被忽略。
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)
);