目前,我正在使用一个数据库的学生音乐课计划。
每当我从数据库中删除一个学生,然后添加一个新的学生,为什么它不添加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)任何帮助都将不胜感激!
发布于 2013-12-11 12:16:07
这是大多数数据库的工作方式;序列只产生新值,而不重用旧值。
这既提高了效率(不需要搜索免费ids),也是个好主意。设想一个集成多个部分的系统,包括您的数据库。然后,您刚刚删除的用户ID仍然可以在其他系统中引用。如果您的数据库在创建新用户时重用ID,那么这些外部系统就会突然引用一个新用户,从而导致难以解决的错误。
如果您必须重用数字,那么您必须指定一个id来显式使用,而不是让数据库为您选择一个。在这种情况下,您必须找到自己的“缺失”数字,如果您使用多个线程或进程的数据库,这将是很困难的。
有关如何影响如何选择新值的更多细节,请参见SQLite自动增量文档;要么得到单调递增的数字(这会产生空白),要么,如果添加AUTOINCREMENT关键字,则保证值为“有史以来使用的最高值+1”。
请注意,默认行为是自动生成比当前使用的值高1的ROWID:
如果插入时没有指定
ROWID,或者指定的ROWID值为NULL,则会自动创建适当的ROWID。通常的算法是在插入之前给新创建的行ROWIDROWID一个,它比表中最大的大一个。 上面描述的普通ROWID选择算法将生成单调递增的唯一ROWIDs,只要您从不使用最大的ROWID值,并且永远不要删除具有最大ROWID的表中的条目。如果您删除了行,或者创建了具有最大可能的ROWID的行,那么在创建新行时可能会重用以前删除的行中的ROWIDs,而新创建的ROWID可能没有严格的升序。
强调我的。
https://stackoverflow.com/questions/20518782
复制相似问题