Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLite3在删除另一个条目时更新主键_Python_Sql_Sqlite - Fatal编程技术网

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

Python SQLite3在删除另一个条目时更新主键,python,sql,sqlite,Python,Sql,Sqlite,目前,我正在使用一个学生音乐课程计划的数据库 每当我从数据库中删除一个学生,然后添加一个新学生时,为什么不添加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

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

每当我从数据库中删除一个学生,然后添加一个新学生时,为什么不添加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,而不是让数据库为您选择一个id。在这种情况下,您必须找到自己的“缺失”编号,如果您从多个线程或进程使用数据库,这将很困难

有关如何影响拾取新值的方式的更多详细信息,请参见;您可以获得单调递增的数字(这可能会产生间隙),或者,如果添加
AUTOINCREMENT
关键字,则一个值将保证为“使用过的最高值加1”

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

如果插入中未指定
ROWID
,或者指定的
ROWID
的值为
NULL
,则会自动创建相应的
ROWID
。通常的算法是给新创建的行一个
ROWID
,该行比插入前表中最大的
ROWID
大一个

上述正常的
ROWID
选择算法将生成单调递增的唯一
ROWID
,只要您从未使用最大的ROWID值,并且从未删除表中具有最大
ROWID
的条目。如果删除行或创建的行具有最大可能的
ROWID
,则在创建新行时可能会重用以前删除的行中的
ROWID
,并且新创建的
ROWID
可能不是严格的升序


强调我的。

那好吧!我只是不确定它为什么会这样做!谢谢你把它清理干净!您是否直接在数据库中尝试了insert语句?我在数据库中对它进行了测试,它可以随意插入。@Jaan:现在删除该行,然后再次插入相同的数据。sqlite本身有一个默认的rowid,所以应该不会有问题。我删除了该记录,尝试了另一次插入,并再次得到一个Id为1的记录。