【问题标题】:sqlite python INSERT IF NOT EXIST with many variablessqlite python INSERT IF NOT EXIST with many variables
【发布时间】:2016-11-27 19:51:20
【问题描述】:

我有一个包含许多列的表,主键是 AUTOINCREMENT,从 1 开始。我正在逐行解析文件中的 csv 数据,并且可以有重复的行。

在这种情况下,我需要检查表 Main 中是否已经存在对下面列出的所有变量具有相同值的行(当然使用增量主键),如果不存在,则使用这些变量创建新行。

INSERT OR IGNORE 在这种情况下不起作用,我不明白为什么。

提前致谢

cur.execute('''INSERT OR IGNORE INTO Main (sku_id, skucat_id, prodline_id, lor_id,
                    skucat_id, georegion_id, geosector_id, month, year,
                    sellin_un, sellin_rur, sellout_un, sellout_rur)
                    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', (sku_id,
                    skucat_id, prodline_id, lor_id, skucat_id, georegion_id,
                    geosector_id, month, year, sellin_un, sellin_rur,
                    sellout_un, sellout_rur, ))

【问题讨论】:

  • 你遇到了什么错误?
  • @ettanany 没有错误,但如果我用一个文件运行脚本两次,我的行就会增加一倍。这是代码,我如何创建它 CREATE TABLE IF NOT EXISTS Main (sku_id TEXT, skucat_id TEXT, prodline_id TEXT, lor_id TEXT, georegion_id TEXT, geosector_id TEXT, month TEXT, year TEXT, sellin_un INTEGER, sellin_rur INTEGER, sellout_un INTEGER, sellout_rur INTEGER )''')
  • @ettanany 我认为主键有问题,因为我有其他表是从同一个文件创建的,但主键是从行值中获取的,而不是自动增量

标签: python mysql sqlite


【解决方案1】:

插入或忽略的忽略部分基于冲突。正如SQLite documentation for on conflicts 中所讨论的,您的表中需要有一个唯一键或主键。

您的表中是否有一列或一组列是唯一的或可用作主键,例如 sku_id?这将导致冲突,因此每当遇到该约束时都会忽略插入。现在,您只是在表上插入没有约束的数据,因此无论何时执行插入都不会检查任何内容。

【讨论】:

  • 是的,对不起错过了更高的我正在创建唯一的自动增量它的 ID 列。 cur.execute(''' CREATE TABLE IF NOT EXISTS Main (id INTEGER PRIMARY KEY AUTOINCREMENT, sku_id TEXT, skucat_id TEXT, prodline_id TEXT, lor_id TEXT, georegion_id TEXT, geosector_id TEXT, month TEXT, year TEXT, sellin_un INTEGER, sellin_rur INTEGER, sellout_un INTEGER, sellout_rur INTEGER)''')
  • 没错,这意味着您所做的每个插入都将有一个唯一的 id,但它不会检查您插入的数据的任何内容。您需要在要插入的数据中指定某些内容,例如 unqiue如果不存在则创建表 Main (sku_id TEXT, skucat_id TEXT, UNIQUE(sku_id));
  • 明白,但在这种情况下我没有唯一的列,只有四列的集合给了我唯一的行。在这种情况下我该如何处理?提前非常感谢
  • 您可以指定唯一列的组合,而不是仅指定一个列来创建唯一行,例如唯一(sku_id,skucat_id,prodline_id,lor_id,georegion_id,geosector_id)
  • CHECK 或 NOT NULL 约束不影响 OR IGNORE。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多