首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sqlite3删除和重新索引项

Sqlite3删除和重新索引项
EN

Stack Overflow用户
提问于 2022-08-17 20:18:10
回答 2查看 47关注 0票数 0

如何在删除数据表中的数据后重新索引Sqlite3数据库中的所有数据。示例操作:我在id中使用整数主键,如果我删除数据,其中id=3、id=4必须是新的id=3,id=5必须是新的id=4 (对于所有数据都是相同的),我需要这样做。有什么办法吗?

我就是这样创建数据库的。

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

这就是我如何从数据库中删除该项的方法。

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

account_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+)也是如此。怎么做?

EN

回答 2

Stack Overflow用户

发布于 2022-08-17 20:28:25

不重新索引数据库中的行。实际上,数据库上下文中的“索引”术语只有一个意思,它与您的意思无关,即数组索引。不要将表视为行数组,因为它不是。表是一组行,因此不能使用其在应用程序中的位置提取行,因为表中没有位置(严格地说,您可以获得ROWID,但该列与数组索引无关)。如果将数据库行加载到应用程序中的数组中,并使用数组索引标识项,则必须维护从数组索引到表PK的映射。如果可能,将item PK存储在item属性中。

票数 1
EN

Stack Overflow用户

发布于 2022-08-17 21:45:43

我认为一般的方法是通过重置自动增量(序列),您可以将该属性添加到您的表ID中,从表中删除该行后,必须写入并执行此查询sqlite_sequenceSETseq= 0 WHEREname = 'table_name';

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

https://stackoverflow.com/questions/73394464

复制
相关文章

相似问题

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