Python SQLite3在删除另一个条目时更新主键
目前,我正在使用一个学生音乐课程计划的数据库 每当我从数据库中删除一个学生,然后添加一个新学生时,为什么不添加ID为1的新学生 添加数据的代码如下所示: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
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的记录。