簡體   English   中英

Python SQLite3刪除另一個條目時更新主鍵

[英]Python SQLite3 Updating primary key when another entry is deleted

目前我正在為學生音樂課程計划者使用數據庫。

每當我從數據庫中刪除一個學生然后我添加一個新學生為什么不添加ID為1的新學生?

添加數據的代碼如下:

def add():
  add = 'y'
  while add == 'y':
    Name = input("Please enter the name of the student: ")
    Year =  int(input("Please enter the students year: "))
    Student = (Name,Year)       
    insert_data(Student)
    print("New data added")
    print()
    add = input("Do you wish to add another student? (y/n) ")
  display = menu.Menu.DisplayMenu("Student") #Adding student name to menu
  choice = GetMenuChoice() #Getting the user's menu choice
  ValidateMenuChoice(choice) #Validating that user choice
  main(choice) #Passing in choice into the main variable

def insert_data(values):
    with sqlite3.connect("records.db")as db:
        cursor = db.cursor()
        sql = "Insert into Student(Name,Year)values(?,?)"
        cursor.execute(sql,values)
        db.commit()

而數據庫代碼是:

def create_student_table():  
    sql = """create table Student
            (StudentID integer,
             Name string,
             Year integer,
             primary key(StudentID))"""
    create_table(db_name,"Student",sql)

任何幫助將不勝感激!

這就是大多數數據庫的工作方式; 序列只生成值而不重用舊值。

這更有效(不必搜索免費ID)和一個好主意。 想象一個集成了多個部分的系統,包括您的數據庫。 然后,您剛刪除的用戶ID仍可在其他系統中引用。 如果您的數據庫在創建新用戶時會重用該ID,那么這些外部系統突然指的是新用戶,從而導致難以解決的錯誤。

如果必須重復使用數字,那么您必須指定一個顯式使用的ID,而不是讓數據庫為您選擇一個。 在這種情況下,您必須找到自己的“缺失”數字,如果您使用來自多個線程或進程的數據庫,這將很難

另請參閱SQLite自動增量文檔 ,了解有關如何影響新值的選擇的更多詳細信息; 你要么得到單調增加的數字(可能產生間隙),要么加上AUTOINCREMENT關鍵字,要保證一個值是'曾經使用的最高值加1'。

請注意,默認行為是自動生成比當前使用的值高1的ROWID

如果沒有ROWID在插入件被指定,或者如果指定ROWID具有值NULL ,則適當的ROWID被自動創建。 通常的算法是為新創建的行提供一個ROWID ,該ROWID插入前表中的最大ROWID大一個

正常的ROWID上述選擇算法將產生單調遞增獨特ROWIDs只要你不使用的最大ROWID值,你永遠不刪除具有最大的表中的條目ROWID 如果你刪除行或如果你曾經創建的最大可能的行ROWID ,那么ROWIDs從以前刪除的行可能會創建新行時,再利用,新創建的ROWID S可能會發生無法在嚴格按升序排列。

強調我的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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