![](/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.