如何在删除数据表中的数据后重新索引Sqlite3数据库中的所有数据。示例操作:我在id中使用整数主键,如果我删除数据,其中id=3、id=4必须是新的id=3,id=5必须是新的id=4 (对于所有数据都是相同的),我需要这样做。有什么办法吗?
我就是这样创建数据库的。
conn = sqlite3.connect("AccStorage.db")
c = conn.cursor()
c.execute("""CREATE TABLE if not exists acc_storage (
acc_id INTEGER PRIMARY KEY AUTOINCREMENT,
acc_platform text,
username text,
user_mail text,
user_password text,
acc_creation_date text,
acc_recovery_codes text,
acc_phone_number text,
acc_recovery_mail text
)""")
c.execute("""INSERT INTO acc_storage (acc_platform,
username,
user_mail,
user_password,
acc_creation_date,
acc_recovery_codes,
acc_phone_number,
acc_recovery_mail) VALUES ('Reddit', 'Fare', 'Tasarruflu@xyz.com', 'abcdefg', '5.5.5', 'xxxxaaaa', '9305010', 'recovery@gmail.com')""")
conn.commit()
conn.close()这就是我如何从数据库中删除该项的方法。
def DeleteFromDatabase(self):
Value_No = 65536
Value_Yes = 16384
isconfirm = self.ask_for_delete()
if isconfirm == Value_Yes:
account_id = int(self.exm_acc_ui.aditaccLabel.text().split(": ")[-1])
conn6 = sqlite3.connect("AccStorage.db")
c6 = conn6.cursor()
c6.execute(f"""DELETE FROM acc_storage WHERE acc_id = {account_id-1}""")
conn6.commit()
conn6.close()
self.editaccWindow.close()
self.examineAccWindow.close()
self.acc_info_read()
elif isconfirm == Value_No:
passaccount_id来自QTableWidgets.currentRow() (它是从表中选中的行),我匹配id和row,并且不删除它就能很好地工作。但是如果我从数据库中删除一个数据(假设有5个数据).如果删除表中的第3行,表中包含的数据行(data1、data2、data4、data5)减少到4行。之后,如果我选择data4来检查它的属性。应用程序崩溃。因为data4 4的id仍然是4,但是在删除data3之后,data4 4的行变成了3。因此,数据4的id必须在删除data3后自我更新。data5和其他数据(data5+)也是如此。怎么做?
发布于 2022-08-17 20:28:25
不重新索引数据库中的行。实际上,数据库上下文中的“索引”术语只有一个意思,它与您的意思无关,即数组索引。不要将表视为行数组,因为它不是。表是一组行,因此不能使用其在应用程序中的位置提取行,因为表中没有位置(严格地说,您可以获得ROWID,但该列与数组索引无关)。如果将数据库行加载到应用程序中的数组中,并使用数组索引标识项,则必须维护从数组索引到表PK的映射。如果可能,将item PK存储在item属性中。
发布于 2022-08-17 21:45:43
我认为一般的方法是通过重置自动增量(序列),您可以将该属性添加到您的表ID中,从表中删除该行后,必须写入并执行此查询sqlite_sequenceSETseq= 0 WHEREname = 'table_name';。
https://stackoverflow.com/questions/73394464
复制相似问题