mysql如何建立无约束关系

vlf7wbxs  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(342)

你好,我在想这个。
我有两张table

Sessions
id_session

Session_Requests
id_session
id_request
url

如何在id\u会话之间建立一种关系,即当我删除会话时,请求仍将保留在该id\u会话中

EX: 
Session id : 0923jguj45g8342

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

当我用一个关系删除会话时,我有一个约束,即我不能再删除会话,或者用null代替不好的会话。
我想有关系,所以当我删除请求表将保持不变。
这可能吗?

hjzp0vay

hjzp0vay1#

这可能吗?
假设该列上有外键:不,这是不可能的。不能让外键包含父表/列中不存在的值。
mysql提供了一组可能的引用操作,这些操作在删除引用行时自动发生: cascade 放弃孩子的记录, set null 将子项设置为 null ,或 restrict 以防止删除。如果其中一个满足您的用例,您就可以使用它。
一种可能的替代方法是在父表中创建一个表示会话状态的附加列,如 is_deleted 用一个 boolean 数据类型,并且可以设置为某个特定值(例如 1 )而不是删除记录。这样,您就可以存储信息而不必破坏密钥。

9fkzdhlc

9fkzdhlc2#

根据您的需求,考虑一个“连接表”(或“连接表”、“参考表”)(aside:does anyone 对这种关系使用其他术语?)
从requests表中删除“id\u session”,并包含一个额外的表,该表应该有两个引用-一个指向sessions,另一个指向session\u请求

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

无论何时插入加入会话的新请求,都必须插入相应的加入条目。无论何时删除会话,都必须删除该会话的联接表条目,并保留请求表
当您第一次听说这种方法时,它是违反直觉的,但是它是在关系数据库中表示多对多(以及非对多?)关系的最佳方法。你会发现这实际上使编码变得更容易。

相关问题