首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除另一个条目时SQLite3更新主键

删除另一个条目时SQLite3更新主键
EN

Stack Overflow用户
提问于 2013-12-11 12:10:12
回答 1查看 648关注 0票数 1

目前,我正在使用一个数据库的学生音乐课计划。

每当我从数据库中删除一个学生,然后添加一个新的学生,为什么它不添加ID为1的新学生呢?

添加数据的代码如下:

代码语言:javascript
复制
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()

数据库代码是:

代码语言:javascript
复制
def create_student_table():  
    sql = """create table Student
            (StudentID integer,
             Name string,
             Year integer,
             primary key(StudentID))"""
    create_table(db_name,"Student",sql)

任何帮助都将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-11 12:16:07

这是大多数数据库的工作方式;序列只产生新值,而不重用旧值。

这既提高了效率(不需要搜索免费ids),也是个好主意。设想一个集成多个部分的系统,包括您的数据库。然后,您刚刚删除的用户ID仍然可以在其他系统中引用。如果您的数据库在创建新用户时重用ID,那么这些外部系统就会突然引用一个新用户,从而导致难以解决的错误。

如果您必须重用数字,那么您必须指定一个id来显式使用,而不是让数据库为您选择一个。在这种情况下,您必须找到自己的“缺失”数字,如果您使用多个线程或进程的数据库,这将是很困难的。

有关如何影响如何选择新值的更多细节,请参见SQLite自动增量文档;要么得到单调递增的数字(这会产生空白),要么,如果添加AUTOINCREMENT关键字,则保证值为“有史以来使用的最高值+1”。

请注意,默认行为是自动生成比当前使用的值高1的ROWID

如果插入时没有指定ROWID,或者指定的ROWID值为NULL,则会自动创建适当的ROWID。通常的算法是在插入之前给新创建的行ROWID ROWID 一个,它比表中最大的大一个。 上面描述的普通ROWID选择算法将生成单调递增的唯一ROWIDs,只要您从不使用最大的ROWID值,并且永远不要删除具有最大ROWID的表中的条目。如果您删除了行,或者创建了具有最大可能的ROWID的行,那么在创建新行时可能会重用以前删除的行中的ROWIDs,而新创建的ROWID可能没有严格的升序。

强调我的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20518782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档