随机唯一整数在插入前避免重复

再见

考虑到需要存储 4 位随机唯一整数,我将如何有效插入高质量的新数字。

如果这些值是在 sqlite 之外创建的,则该值可能已经存在于数据库中

执行此类任务的最佳方法是什么?

迈克

您可以将存储数字的列设为唯一,并在具有多个值的 SINGLE INSERT 上使用 INSERT OR IGNORE(为了效率)。例如:-

INSERT OR IGNORE INTO rndm_id VALUES
  ('0001'),('0027'),('9999'),('0412'),('2108'),
  ('0001'), -- duplicate will be skipped
  ('3085') -- and so on
;

注释值已括在引号中以保持 4 个数字。该表是使用以下定义的:-

CREATE TABLE IF NOT EXISTS rndm_id (myid TEXT UNIQUE);

如果您正在考虑大量值,则可能需要考虑:-

SQL 语句的最大长度

SQL 语句文本中的最大字节数限制为 SQLITE_MAX_SQL_LENGTH,默认为 1000000。您可以将此限制重新定义为 SQLITE_MAX_LENGTH 和 1073741824 中较小的一个。

如果 SQL 语句的长度限制为一百万字节,那么显然您将无法通过将它们作为文字嵌入到 INSERT 语句中来插入数百万字节的字符串。但无论如何你都不应该这样做。为您的数据使用主机参数。准备像这样的简短 SQL 语句:

插入 tab1 值(?,?,?);然后使用 sqlite3_bind_XXXX() 函数将大字符串值绑定到 SQL 语句。绑定的使用避免了对字符串中的引号字符进行转义的需要,从而降低了 SQL 注入攻击的风险。由于不需要分析或复制大字符串,因此运行速度也更快。

可以在运行时使用 sqlite3_limit(db,SQLITE_LIMIT_SQL_LENGTH,size) 接口降低 SQL 语句的最大长度。SQLite 中的限制

考虑到评论

有没有办法我可以做一个选择来提供一组我可以使用的新值,然后再插入?

因此,假设您想要 1000 个 4 位唯一随机值,那么以下可能就足够了:-

DROP TABLE IF EXISTS save_for_later; -- Drop the table
CREATE TEMP TABLE IF NOT EXISTS save_for_later (four_digit_random_value UNIQUE); -- Create a temporary table

-- Create a table with 1500 random rows 
WITH RECURSIVE cte1 AS (
    SELECT CAST((abs(random() % 10)||abs(random() % 10)||abs(random() % 10)||abs(random() % 10)) AS TEXT)
    UNION ALL SELECT CAST((abs(random() % 10)||abs(random() % 10)||abs(random() % 10)||abs(random() % 10)) AS TEXT)
    FROM cte1 LIMIT 1500
    )
INSERT OR IGNORE INTO save_for_later SELECT * FROM cte1;

-- Later on extract the 1000 required rows.
SELECT * FROM save_for_later LIMIT 1000;

疑似要求

如果问题是如何将一组 (300) 的随机 4 个数字唯一值插入到包含现有数据的表(主)中,其中新值与现有值一起也应该是唯一的

那么以下可以做到这一点(请参阅注意限制):-

DROP TABLE IF EXISTS master; -- 
CREATE TABLE IF NOT EXISTS master (random_value TEXT UNIQUE);

-- Master (existing) Table populated with some values
INSERT OR IGNORE INTO master VALUES
  ('0001'),('0027'),('9999'),('0412'),('2108'),
  ('0001'), -- duplicate will be skipped
  ('3085') -- and so on
;
SELECT * FROM master; -- Result 1 show what's in the master table

-- Create a table to save the values for later
DROP TABLE IF EXISTS save_for_later; -- Drop the table
CREATE TEMP TABLE IF NOT EXISTS save_for_later (four_digit_random_value UNIQUE); -- Create a temporary table

-- Populate the vales to be saved for later excluding any values that already exist
-- 1500 rows perhaps excessive but very likely to result in 300 unique values
WITH RECURSIVE cte1(rndm) AS (
    SELECT 
        CAST((abs(random() % 10)||abs(random() % 10)||abs(random() % 10)||abs(random() % 10)) AS TEXT)
    UNION ALL 
    SELECT 
        CAST((abs(random() % 10)||abs(random() % 10)||abs(random() % 10)||abs(random() % 10)) AS TEXT) 
    FROM cte1 
    LIMIT 1500 --<<<<<< LIMIT important otherwise would be infinite
    )
    INSERT OR IGNORE INTO save_for_later 
        SELECT * FROM cte1 
            WHERE rndm NOT IN(SELECT * FROM master)
;

-- Later on extract the required rows (300 here) and insert them.
INSERT INTO master
    SELECT * FROM save_for_later 
    LIMIT 300;

SELECT * FROM master; -- Should be 6 original/existing rows + 300 so 306 rows (although perhaps a chance that 300 weren't generated)
  • 请注意,对于 4 个数字,存在 10,000 个可能值 (0000-9999) 的限制,因此原始表中存在的值越多,查找唯一值时出现问题的可能性就越大。

以上将导致:-

生成新值之前的第一个结果是主表:-

在此处输入图片说明

添加新值后的结果(原始 6 行 + 新 300 行):-

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

随机唯一整数值

来自分类Dev

随机唯一整数值

来自分类Dev

随机唯一整数的非标准排序算法

来自分类Dev

用固定的数字池中的随机唯一整数填充向量

来自分类Dev

NumPy-选择范围内唯一整数的随机列表

来自分类Dev

使用n个唯一整数生成随机整数而不进行替换以获得固定的总和(Python)

来自分类Dev

生成包含唯一随机整数的数组,检查重复项

来自分类Dev

RethinkDb中的唯一整数计数器

来自分类Dev

下拉字段仅显示可用的唯一整数Rails

来自分类Dev

Python:从列表中查找最低的唯一整数

来自分类Dev

Postgres:向结果添加唯一整数?

来自分类Dev

无法设置唯一键来避免插入重复的行?

来自分类Dev

从输入文件中读取整数,只存储数组 C++ 中的唯一整数

来自分类Dev

使用$ _SESSION在每次刷新时(从上一次)数组中的唯一整数

来自分类Dev

如何在Java中创建64位唯一整数

来自分类Dev

Matlab遗传算法(GA)仅使用唯一整数

来自分类Dev

这个C ++代码片段如何将任意类型转换为唯一整数?

来自分类Dev

接受唯一整数排序列表的函数count_numbers

来自分类Dev

对象的唯一整数或字符串标识符(哈希)

来自分类Dev

在1行代码中计算向量中每个唯一整数的实例?

来自分类Dev

有没有更好的实现来保留唯一整数对的计数?

来自分类Dev

如何在Java中创建64位唯一整数

来自分类Dev

在C#中为Unity生成10个唯一整数

来自分类Dev

生成填充唯一整数的数组的当前代码崩溃

来自分类Dev

唯一随机生成的整数的Java数组

来自分类Dev

如何创建唯一的随机整数?

来自分类Dev

For 循环中的唯一随机整数

来自分类Dev

使用唯一索引插入重复的数据

来自分类Dev

唯一的前5个随机查询

Related 相关文章

  1. 1

    随机唯一整数值

  2. 2

    随机唯一整数值

  3. 3

    随机唯一整数的非标准排序算法

  4. 4

    用固定的数字池中的随机唯一整数填充向量

  5. 5

    NumPy-选择范围内唯一整数的随机列表

  6. 6

    使用n个唯一整数生成随机整数而不进行替换以获得固定的总和(Python)

  7. 7

    生成包含唯一随机整数的数组,检查重复项

  8. 8

    RethinkDb中的唯一整数计数器

  9. 9

    下拉字段仅显示可用的唯一整数Rails

  10. 10

    Python:从列表中查找最低的唯一整数

  11. 11

    Postgres:向结果添加唯一整数?

  12. 12

    无法设置唯一键来避免插入重复的行?

  13. 13

    从输入文件中读取整数,只存储数组 C++ 中的唯一整数

  14. 14

    使用$ _SESSION在每次刷新时(从上一次)数组中的唯一整数

  15. 15

    如何在Java中创建64位唯一整数

  16. 16

    Matlab遗传算法(GA)仅使用唯一整数

  17. 17

    这个C ++代码片段如何将任意类型转换为唯一整数?

  18. 18

    接受唯一整数排序列表的函数count_numbers

  19. 19

    对象的唯一整数或字符串标识符(哈希)

  20. 20

    在1行代码中计算向量中每个唯一整数的实例?

  21. 21

    有没有更好的实现来保留唯一整数对的计数?

  22. 22

    如何在Java中创建64位唯一整数

  23. 23

    在C#中为Unity生成10个唯一整数

  24. 24

    生成填充唯一整数的数组的当前代码崩溃

  25. 25

    唯一随机生成的整数的Java数组

  26. 26

    如何创建唯一的随机整数?

  27. 27

    For 循环中的唯一随机整数

  28. 28

    使用唯一索引插入重复的数据

  29. 29

    唯一的前5个随机查询

热门标签

归档