当前位置: 首页 > 知识库问答 >
问题:

使用Python和sqlite,在确保值不重复的情况下,向数据库中插入值的最快方法是什么?[副本]

仲孙钊
2023-03-14

我正在制作一个小脚本,其中包括一个包含四个条目(id、x、y和z)的数据库。id应该是唯一且连续的,因此我对每个条目使用“主键”id。其他值可以是任何实数,但数据库不应包含x、y和z三个值都相同的两个条目。

因此,该表定义如下:

 if __name__ == "__main__":
    c.execute('drop table nodes')
    c.execute('create table nodes (id integer primary key, x real, y real, z real)')

然后我将新条目插入表中,如下所示:

c.execute('select * from nodes where x={x} and y={y} and z={z}'.format(x=x,y=y,z=z))
            if len(c.fetchall())==0:
                q="""
                  INSERT INTO nodes
                  (`x`, `y`, `z`)
                  VALUES
                  (%f,%f,%f) 
                  """ % (x,y,z)
                c.execute(q)

这种方法可行,但随着数据库的增大,速度会变得非常慢。有没有更快的方法将条目插入数据库,同时确保它们是唯一的值组合?

共有1个答案

贺高飞
2023-03-14

主键只是确保表行唯一的一种方法,如果x、y、z是唯一的其他列,那么为什么不将它们作为主键呢?

如果您以x、y和z为主键创建表:

CREATE TABLE nodes(
  x, 
  y, 
  z, 
  PRIMARY KEY (x,y,z)
);

然后sqlite将不接受所有相同的行。

然后,您可以使用REPLACE而不是INSERT:https://sqlite.org/lang_replace.html来确保只输入唯一的行而不必处理错误

REPLACE INTO nodes
    (`x`, `y`, `z`)
VALUES
    (%f,%f,%f)

这应该可以解决这个问题。

 类似资料:
  • 我已经创建了复制分支用户权限的方法。权限通常为0到120个项目。运行此方法将此(0到120)项插入到7个用户ID需要35-55秒才能插入到表中。 我需要优化这个过程,因为数据插入的性能很慢。我在想如果超过10个用户,那么这个过程会花费太长时间。有没有办法提高插入数据的性能速度? 提前谢谢你!

  • 问题内容: 我知道,为了在MySQL数据库中插入大于字节的值,默认解决方案是确保客户端和服务器端变量都大于查询插入数据库中的数据块。 但是,是否有任何方法可以 不 更改上述服务器端变量?当我必须将数据插入ISP所托管的不允许更改限制的数据库中时,这将很有用。 另一个相关问题:MySql 限制为4GB,但限制为1GB。那么,是否可以在表列中插入大于1GB的值? 问题答案: 我最近偶然发现了这个问题。

  • 在我的网站,我正在尝试加载产品项目而不刷新整个页面。我通过和设法做到了这一点。然而我遇到了一个问题。产品项包含单个图像。但由于我将间隔设置为3秒,它会重新下载所有需要的资源,我认为这是一个问题,因为连接速度慢的用户会感到恼火。我在开发工具上模拟了一个慢速连接,只是想看看会发生什么。 这就是结果。重新加载图像或整个product_item页面需要时间。 这是我的密码 现在我想知道什么是高效加载数据的

  • 我想向数据库中插入值,但它无法工作,尽管我的代码在用作存储过程时运行良好。我需要使用按钮点击来存储值。请告诉我代码有什么问题。它没有显示任何错误或异常,但表中的数据没有更新

  • 我正在创建一个Android应用程序,将数据保存在SQLite数据库中,然后从同一个数据库读取数据。这样一来,我就不需要每次将数据联机到MySQL服务器。我将其连接到一个外部数据库,提取数据,并尝试查看数据是否正在保存,但当我尝试使用函数从SQLite数据库获取数据时,它似乎是空的 对于获取数据的类,数据会保存下来,当我试图检查它时,它会告诉我它是空的 所以我为测试添加了这个函数,并将其命名为On

  • 问题内容: 我正在学习CopyOnWriteArrayList类。 复制新阵列的目的是什么? 是其他线程读取数组吗? 因此,如果系统具有高并发性,并且大多数线程的操作都在读取而不是写入,那么最好使用。 问题答案: 如该链接所述: CopyOnWriteArrayList是Java 5并发API中引入的并发Collection类,以及它在Java中流行的表亲。 工具列表界面类似,并且但它的一个线程安