![](/img/trans.png)
[英]What happens when you drop a primary key constraint that has a foreign key attached to it in Oracle and then re-enable the primary key?
[英]sqlite what happens to id when you delete a row with a foreign key?
我有这两张表:
class User(Base):
""" User entry in database """
__tablename__ = "users"
# ID uniquely identifies
id = Column(Integer, primary_key=True, index=True)
kerberos = Column(String, unique=True, index=True)
hashpass = Column(String)
is_active = Column(Boolean, default=True)
creation_date = Column(DateTime, default=None)
scores = relationship("Score", back_populates="owner")
class Score(Base):
""" Stores each users scores """
__tablename__ = "scores"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(String, ForeignKey("users.id"), index=True)
score = Column(Integer)
time = Column(DateTime)
owner = relationship("User", back_populates="scores")
我已经读过添加新的“用户”将自动增加“id”字段。 现在,“scores”表中的每个条目都有一个指向 users.id 的外键。 这意味着(如果我错了,请纠正我),每个“分数”条目都映射到一个且唯一的唯一用户(因此分数:用户关系是多:一个)。
我想知道这是否是一个好的设计,特别是如果我删除一个用户,会发生什么? 删除用户是否会自动使通过已删除用户的 id(这些分数的外键)链接的相应分数无效/删除? 我担心删除用户之后所有用户 ID 都会向下移动一个,因此在查看用户的分数时会出现一个问题。
这是好设计吗? 随意链接资源/重定向到另一个问题(我找不到任何具体的问题)
我想知道这是否是一个好的设计,特别是如果我删除一个用户,会发生什么?
就目前而言,您将无法删除用户,因为会导致外键冲突。 如果您没有 FK 约束来保护参照完整性,那么您将孤立分数(它们将没有父级),这可能导致意外结果并可能导致崩溃。
为了能够删除用户,我相信您可以使用ForeignKey("users.id", onupdate="CASCADE", ondelete="CASCADE")
然后删除用户(父级)将 CASCADE 删除,从而由于onDelete="CASCADE"
而删除子级(链接到该特定父级的分数)。
如果您曾经更改用户的 id 值,那么子项中的 user_id 将被更改(即对 id 的更新将向下级联到子项)。
我担心删除用户之后所有用户 ID 都会向下移动一个,
不,他们不会,除非您制作它们(您可能不想这样做)。 但是,如果将 onUpdate 操作作为 CASCADE,如果 id 被更改,则对 id 的更改将被 CASCADEd。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.