簡體   English   中英

sqlite 當你用外鍵刪除一行時 id 會發生什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM