【D11】避免重复交易资料汇入:使用PK和Unique key

前言

用了前面的范例,尤其是历史资料,会发现有可能重复输入的状况,或是重复资料输入不进去。这是我故意的XDD/images/emoticon/emoticon15.gif
就是让这一篇有机会出现,也就是用来说明避免重复输入的状况。

本日会修改的程序码:


发生原因

因为我们汇入的时候,有时候会把历史资料汇进来,像是第10天的资料是「每日市场成交资讯」,而资料以当月为一个资料及,例如现在9月,所以会显示过去9月的交易状况,完整的提供,像今天是11日,就会收到从9/1~9/11这段时间的交易,如果是30日,就会收到整个月1~30日的所有资料,这时候没有过滤就会收到很多重复的资料,尤其是每天都执行的话!

而有些则是汇入一些历史资料的关系,像原先可能只有用一年份来进行检测,後来发现这样效果不错,所以就花时间把所有历史资料抓下来(有的资料只能一个月一个月抓,不能用年为单位或是整批抓),这时候有可能资料会重复抓取,也是需要过滤。

方法

使用主键(Primary key)

最常见的方法,就是使用主键(Primary key,又称PK,後续用PK代替),它具有单一性值,不允许重复,当重复的时候就会发生例外事件。
像是发生在第9天的程序码,目前最新的是在9/9:

2021-09-09	17175.00	17319.00	17123.00	17304.00

由於他每次都会抓一个月份,因此今天为了让9/10的资料可以汇入资料库,就直接执行档案,结果会发生9/1的资料重复:

(1062, "Duplicate entry '2021-09-01' for key 'PRIMARY'")

这时候可以使用MySQL的一个语法IGNORE,是用在INSERT中,可以忽略重复输入的状况,语法如下:

INSERT IGNORE INTO table_name(...)VALUES(...) 

重新执行後,我们就可以看到成功资讯,而资料库也补上9/10的资料(昨天收大红盘~17475点)

===Finish: 8==

而资料库也正确的出现这笔资料:

2021-09-10	17270.00	17475.00	17270.00	17475.00

使用Unique index

然而我们范例中,像是第6天的程序码,我们的PK是个ID,而且是随着输入增加,因此不会有重复的状况。这时候就不能过滤PK重复的状况,要另外设定一组Unique index的方式,可以让这组的栏位变成为一值,也就是上述PK的状况。

语法如下:

ALTER TABLE table_name ADD UNIQUE INDEX(column1, column2...);

所以我们需要变动两张表(table),分别是第4天第6天的表(table):

ALTER TABLE LegalDailyFutureOption ADD UNIQUE INDEX(TradeDate, TradeGroup);
ALTER TABLE DailyPrice ADD UNIQUE INDEX(TradeDate, Symbol);

然後再重新跑这两只程序,就可以取得资料但不重复罗!如果不这样改,会一直把资料持续写入,因为他们的PK并不会重复而产生问题。

PK和 Unique index有何不同?

他们都是代表唯一值的概念,都可以为单一栏位或是组合的栏位,但是PK是一定要有值的,Unique是表示不能重复,但是可以为Null。这就是他们的差异。

而且PK,可以在跟Unique index结合,像是我们有给他们不重复值,但是我们又希望他们某些特徵值不会重复,就是可以组合一起使用,就好像在第4天第6天的状况就是如此。不过以这个案例来说,简单一点,就是要把ID拿掉,直接用设定的UNIQUE INDEX就可以解决。


<<:  Day 01 HTML<常用标签>

>>:  GitHub Actions 基本介绍 - 开始自动化 workflow 的第一步

[Day 13] Update 更新资料

现在有几个collection在ProductController.php中 public func...

Day08 - 实作一个状态机 - 1

根据需求画出状态图後 他们都有一个初始状态 整个实体、物件或是对象,都有一系列不同的状态们 还有一系...

Day28 React - Countdown Timer

import React, {useRef, useState,useEffect} from '...

JSON介绍

今天要先介绍JSON的写法,明天的实作会取用今天建置好的JSON档介绍Methods和Compute...

Day 07 借箸代筹(1):运算式、运算子

前文曾述及的陈述句(statement),是构成JavaScript程序的两大类语法之一,其之二,即...