从 SQL db 中连续检测 2 个重复值,否则更新插入(使用 python)

Posted

技术标签:

【中文标题】从 SQL db 中连续检测 2 个重复值,否则更新插入(使用 python)【英文标题】:Detect 2 duplicate values in a row from SQL db and update otherwise insert (using python) 【发布时间】:2021-02-04 23:20:13 【问题描述】:

我想插入 mysql 数据库,除非两列值匹配,在这种情况下我想更新 2 个值。使用 Python。

我的栏目是:ID、Ticker、Subreddit、Score、Rockets 和 DateTime

我想做的是:

如果代码和日期(仅)不存在,则插入新记录,否则更新分数和火箭

我所说的“DATE(仅)”是指从 DATETIME 开始,我只想匹配日期。所以如果是: 2021-02-05 09:52:54 我想检查一下 Ticker 是否存在 2021-02-05。

这是一个完整条目的样子:

704   AYOLO   r/wallstreetbets    1843    0   2021-02-05 09:52:54

要插入数据库,我目前有这个:

def upload_to_database(ticker_collection):
  trend_data = []
  trend_data_table = "trend_data"
  trend_data_columns = "Ticker, Subreddit, Score, Rockets"
  trend_data_sql = "INSERT INTO " + trend_data_table + " (" + trend_data_columns + ") VALUES (%s, %s, %s, %s)"

  for ticker in ticker_collection:
    ticker_subreddit = ticker_collection[ticker]['subreddit']
    ticker_score = ticker_collection[ticker]['score']
    ticker_rockets = ticker_collection[ticker]['rockets']
    
    ticker_data = (ticker, ticker_subreddit, ticker_score, ticker_rockets)

    trend_data.append(ticker_data)
  
  the_db_cursor.executemany(trend_data_sql, trend_data)
  the_database.commit()

  return the_db_cursor.rowcount, "was inserted."

我已经阅读了很多关于 ON DUPLICATE KEY UPDATE VALUES 的内容,但我不知道如何将其合并以检查两列,以及如何仅提取和匹配日期,然后将其与我机器的当前日期匹配。

【问题讨论】:

这两列是主键吗? 暂时没有,但我可以制作它们,它们都必须是主键吗? 好吧,我想不是……它们也可能是唯一的键…… 我已将它们设置为唯一,这与我的代码需求有何关联? 【参考方案1】:

MySQL 显然可以创建功能索引,因此您可以在没有生成列的情况下使其工作。我在小提琴网站上没有成功,但我确实使用索引生成列成功

CREATE TABLE IF NOT EXISTS blah (
  id INT AUTO_INCREMENT PRIMARY KEY,
  tick varchar(10),
  score varchar(10),
  dt datetime,
  d datetime generated always as (date(dt)),
  unique key x(tick, d)
);
                                  
insert into blah (score, tick, dt) values('a', 'a','2020-01-01 12:34');
                                     
insert into blah (score, tick, dt) values('new', 'a','2020-01-01 12:35')
ON DUPLICATE KEY UPDATE score=VALUES(score);

如果您将最后一行注释掉,您会看到有关键中重复值的错误..

使用最后一行而不是插入新记录,现有行的分数列将更新为“新”

https://www.db-fiddle.com/f/931XpBo8PFqMzL25uoy5zy/0

【讨论】:

【参考方案2】:

您必须将“ticker”和“date”列设置为主键或唯一索引。如果你这样做,那么你可以将你的 SQL 查询设置为:

INSERT INTO your tablename (column_list)
VALUES (value_list)
ON DUPLICATE KEY UPDATE
updatecolumn_1 = value_1,
updatecolumn_1 = value_2,
........................,
........................,
updatecolumn_n = value_n

;

【讨论】:

以上是关于从 SQL db 中连续检测 2 个重复值,否则更新插入(使用 python)的主要内容,如果未能解决你的问题,请参考以下文章

SQL:检测具有相同键的连续行的连续块

jdbc-db2 - 提取完整记录[重复]

使用带有逗号值的 WHERE 的 SQL [重复]

查找一组 n 个连续数字是不是在 SQL 中重复

SQL:连续天数的计算方法

从 2 个不同的数据库(MySQL 和 SQL)在 Listview 中插入值