用了前面的范例,尤其是历史资料,会发现有可能重复输入的状况,或是重复资料输入不进去。这是我故意的XDD
就是让这一篇有机会出现,也就是用来说明避免重复输入的状况。
本日会修改的程序码:
因为我们汇入的时候,有时候会把历史资料汇进来,像是第10天的资料是「每日市场成交资讯」,而资料以当月为一个资料及,例如现在9月,所以会显示过去9月的交易状况,完整的提供,像今天是11日,就会收到从9/1~9/11这段时间的交易,如果是30日,就会收到整个月1~30日的所有资料,这时候没有过滤就会收到很多重复的资料,尤其是每天都执行的话!
而有些则是汇入一些历史资料的关系,像原先可能只有用一年份来进行检测,後来发现这样效果不错,所以就花时间把所有历史资料抓下来(有的资料只能一个月一个月抓,不能用年为单位或是整批抓),这时候有可能资料会重复抓取,也是需要过滤。
最常见的方法,就是使用主键(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
然而我们范例中,像是第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
是表示不能重复,但是可以为Null
。这就是他们的差异。
而且PK
,可以在跟Unique index
结合,像是我们有给他们不重复值,但是我们又希望他们某些特徵值不会重复,就是可以组合一起使用,就好像在第4天和第6天的状况就是如此。不过以这个案例来说,简单一点,就是要把ID
拿掉,直接用设定的UNIQUE INDEX
就可以解决。
>>: GitHub Actions 基本介绍 - 开始自动化 workflow 的第一步
现在有几个collection在ProductController.php中 public func...
根据需求画出状态图後 他们都有一个初始状态 整个实体、物件或是对象,都有一系列不同的状态们 还有一系...
import React, {useRef, useState,useEffect} from '...
今天要先介绍JSON的写法,明天的实作会取用今天建置好的JSON档介绍Methods和Compute...
前文曾述及的陈述句(statement),是构成JavaScript程序的两大类语法之一,其之二,即...