MYSQL如何建立无约束的关系?

问题描述 投票:0回答:1

你好,我想弄清楚这个问题。

我有2个表

Sessions
id_session

Session_Requests
id_session
id_request
url

我如何在id_session之间建立关系,当我删除session时,请求仍将与该id_session保持一致。

EX: 
Session id : 0923jguj45g8342

Request
id_session = 0923jguj45g8342
id_request = 1
url = https://example.com

当我用关系删除会话时,我有一个约束条件,我不能再删除会话,或者用null代替会话,这是不对的。

我想有一个关系,所以当我删除时,请求表将保持不变。

这是可能的吗?

php mysql mysqli relation
1个回答
0
投票

这可能吗?

假设你在该列上有一个外键:不,这是不可能的。你不能让一个外键持有一个在父表column中不存在的值。

MySQL提供了一个可能的工具包 参考动作 当参考行被删除时自动发生的。cascade 删除子记录。set null 来设置子键为 nullrestrict 来防止被删除。如果其中有一个符合你的用例,你可以使用它。

一个可能的替代方法是在父表中创建一个额外的列来表示会话的状态,比如说 is_deleted 附带 boolean 数据类型,并且你可以将其设置为一些特定的值(例如 1) 而不是 删除记录。这让你在不破坏键的情况下存储信息。


0
投票

根据你的要求,可以考虑用 "连接表"(或 "连接表"、"参考表")。(旁白:有没有人用其他术语来描述这种关系?)

从requests表中删除 "id_session",并包含一个额外的表,该表应该有两个引用--一个指向Sessions,另一个指向Session_Requests。

T_Join_sessions_requests
  id_session  -- points to the session
  id_request  -- points to the request

每当你插入一个新的请求时,你必须插入相应的join条目。每当你删除一个会话时,你也必须删除该会话的join表条目,并保留请求表。

当你第一次听到这种方法时,它是反直觉的,但它是关系数据库中表示多对多(和非多对多? )关系的最好方法。而且你会发现,这实际上使对它的编码变得更加容易。

© www.soinside.com 2019 - 2024. All rights reserved.