· 6 years ago · Mar 20, 2019, 01:08 PM
1# sqlite3触å‘器的使用实例
2对于SQLiteå’ŒSQLite的触å‘器,我先说一些结果å§ï¼š
3
4#### 01. SQLite䏿”¯æŒèµ‹å€¼æ“作,自然也没有å˜é‡ä¹‹è¯´ã€‚
5å»ºè¡¨æ—¶ï¼Œå¦‚æžœä¸æŒ‡å®š NOT NULL çš„è¯ï¼Œä¸»é”®å’Œè”åˆä¸»é”®çš„å—æ®µæ˜¯å¯ä»¥æ’å…¥NULL值的。
6建表时,强烈建议主键/è”åˆä¸»é”®æ˜¯NOT NULL的,在SQLiteä¸ï¼Œä¸»é”®ä¸ºNULL的数æ®è¡Œå¯ä»¥é‡å¤æ’入:
7```sql
8CREATE TABLE kv(
9k TEXT NULL PRIMARY KEY,
10v TEXT NULL
11);
12SELECT * FROM kv;
13REPLACE INTO kv(k,v)VALUES(NULL,'value_of_NULL'),('key','value');
14```
1502. NULL与任何数æ®è¿›è¡Œè¿ç®—,结果都是NULL。ISNULLå’ŒNOTNULLåº”è¯¥ä¸æ˜¯è¿ç®—符。请执行下é¢çš„è¯å¥è¿›è¡Œæµ‹è¯•:
16```sql
17SELECT 1=NULL, 1!=NULL, NULL=NULL, NULL!=NULL, NULL ISNULL, NULL IS NULL, NULL NOTNULL;
18```
1903. 在CASE-WHEN-THEN-ELSE-ENDè¯å¥ä¸ï¼ŒTHENåŽé¢å¯ä»¥æŽ¥SELECTè¯å¥ï¼Œä½†æ˜¯æ²¡æ³•接INSERT/REPLACE/UPDATEè¯å¥ï¼Œè²Œä¼¼å› 为它们没有返回值。
2004. SQLite没有FLOOR函数ã€CEIL函数ã€POWER函数ã€ç‰å‡½æ•°ã€‚
2105. å½“ä½ å¯¹SQLite有什么猜想需è¦éªŒè¯æ—¶ï¼Œä¸è¦ç”¨NavicatForSQLite进行验è¯ï¼Œå»ºè®®ä½¿ç”¨SQLiteStudio,至少我还没有å‘现SQLiteStudio异常的地方。(注:Navicat里é¢å¯ä»¥å¯¹SQLite执行POWERå’ŒFLOORç‰å‡½æ•°ï¼Œä½†æ˜¯åŽŸç”Ÿçš„SQLite䏿”¯æŒå®ƒä»¬ã€‚触å‘器的æŸäº›å†™æ³•在Navicat里é¢åˆ›å»ºå¤±è´¥ï¼Œä½†æ˜¯ç”¨SQLite官网æä¾›çš„程åºå°±å¯ä»¥åˆ›å»ºæˆåŠŸï¼‰ã€‚
2206. 触å‘å™¨é‡Œé¢æ— 法使用IF-ELSEè¯å¥ã€‚
2307. 触å‘å™¨é‡Œé¢æ— 法创建临时表。
2408. 触å‘器在进行递归调用时,会报错(Error while executing SQL query on database 'test.sqlite3': too many levels of trigger recursion),并没有陷入æ»å¾ªçޝä¸ï¼Œè¿™ä¸ªæŒºå¥½ã€‚ï¼ˆéªŒè¯æ–¹å¼ï¼šç»™ä¸€ä¸ªæ•°æ®è¡¨åˆ›å»ºä¸¤ä¸ªUPDATE OF触å‘å™¨ï¼Œä¸€ä¸ªæ˜¯å—æ®µA的触å‘å™¨ï¼Œå®ƒä¼šæ›´æ–°å—æ®µBï¼Œä¸€ä¸ªæ˜¯å—æ®µB的触å‘å™¨ï¼Œå®ƒä¼šæ›´æ–°å—æ®µA,然åŽå¤–部用UPDATEè¯å¥é©±åŠ¨ç¨‹åºè¿›å…¥è¿™ä¸ªæ»å¾ªçŽ¯ï¼ŒæŸ¥çœ‹ç»“æžœï¼‰ã€‚
2509. 行级触å‘器里é¢çš„NEWå’ŒOLD是æŸè¡Œæ•°æ®çš„引用。引用的值在触å‘器的本次调用过程ä¸ä¸ä¼šæ”¹å˜ï¼ˆåœ¨æœ¬æ¬¡è°ƒç”¨è¿‡ç¨‹ä¸ï¼Œå³ä½¿æˆ‘UPDATE了æŸä¸ªå—段的值,NEWä¸çš„è¿™ä¸ªå—æ®µçš„值也ä¸ä¼šæ”¹å˜/å®žæ—¶æ›´æ–°ï¼‰ã€‚ï¼ˆéªŒè¯æ–¹å¼ï¼šè‡ªå·±åˆ›å»ºä¸€ä¸ªæ•°æ®è¡¨å’Œä¸€ä¸ªæ—¥å¿—表,创建一个数æ®è¡¨çš„触å‘器,将NEWçš„æ‰€æœ‰å—æ®µçš„值写进日志表,修改æŸä¸ªå—段的值,å†å°†NEWçš„æ‰€æœ‰å—æ®µçš„值写进日志表)。
2610. 对于UPDATEè¯å¥ï¼ˆUPDATE 表å SET field_1=value_1,field_2=value_2,... WHERE æ¡ä»¶;),ä¸è®ºè¿™ä¸ªUPDATEè¯å¥åŒæ—¶SETäº†å¤šå°‘å—æ®µï¼Œå¦‚果它仅仅修改了一行,那么UPDATEçš„FOR EACH ROW触å‘å™¨ä»…è°ƒç”¨ä¸€æ¬¡ã€‚ï¼ˆéªŒè¯æ–¹å¼ï¼šè‡ªå·±åˆ›å»ºä¸€ä¸ªæ•°æ®è¡¨å’Œä¸€ä¸ªæ—¥å¿—表,创建一个数æ®è¡¨çš„触å‘器,触å‘器ä¸å¾€æ—¥å¿—表ä¸å†™è¿›NEW的所有值,往数æ®è¡¨é‡ŒINSERTå‡ è¡Œæ•°æ®ï¼Œç„¶åŽUPDATEæŸä¸€è¡Œå—æ®µçš„å‡ ä¸ªå€¼ï¼‰ã€‚
2711. 触å‘器的调用顺åºï¼Œè²Œä¼¼æ˜¯å¯¹è§¦å‘器按照å嗿ޒåºï¼Œç„¶åŽé€ä¸ªè°ƒç”¨ã€‚ï¼ˆéªŒè¯æ–¹å¼ï¼šä¸€ä¸ªæ•°æ®è¡¨åˆ›å»ºä¸¤ä¸ªAFTER INSERT触å‘器,触å‘器里é¢å¾€æ—¥å¿—表ä¸å†™æ¶ˆæ¯ï¼Œå¾€æ•°æ®è¡¨ä¸INSERT一行数æ®ï¼ŒæŸ¥çœ‹æ—¥å¿—表,对触å‘器改å,å†å°è¯•一次)。
28䏋颿˜¯ä¸€ä¸ªå®žæˆ˜çš„例å:
29说明:ä¸å»ºè®®æŒ‰ç…§è¿™ä¸ªä¾‹åçš„å†™æ³•è¿›è¡Œä½œä¸šï¼Œè¿™æ ·åšçš„è¯ï¼Œå¯è¯»æ€§å’Œå¯ç»´æŠ¤æ€§ä¸å¥½ï¼Œå„个表之间是强耦åˆçš„ï¼ŒåŽæœŸæœ‰æ”¹åŠ¨çš„è¯ï¼Œå¯èƒ½ä¼šç‰µä¸€å‘而动全身。
30本例则主è¦å†…容:股票数æ®å˜å‚¨åœ¨ä¸¤ä¸ªæ–‡ä»¶ä¸ï¼Œæˆ‘需è¦å°†è¿™ä¿©æ–‡ä»¶å˜å‚¨åˆ°raw_data_1å’Œraw_data_2ä¸ï¼Œç„¶åŽåˆ©ç”¨raw_dataä¸çš„æ•°æ®åœ¨ä¸é—´è¡¨it_dataä¸åŠ å·¥å‡ºæ¥æ•°æ®ï¼Œå¹¶å°†å…¶æ›´æ–°åˆ°ç›®æ ‡æ•°æ®è¡¨target_dataä¸ï¼ŒåŠ å·¥æ–¹å¼æ˜¯åˆ©ç”¨price_tickå’Œpre_close_price计算出æ¥ç¬¬äºŒå¤©çš„æ¶¨è·Œåœä»·ã€‚
31代ç å¦‚ä¸‹ï¼ˆå¦‚æžœä»£ç æ˜¾ç¤ºä¸å®Œå…¨ï¼Œå¯ä»¥ç‚¹å‡»â€œview plainâ€æŸ¥çœ‹å®Œæ•´ä»£ç ):
32```sql
33--我为自己规定的触å‘器åå—çš„é€šç”¨æ ¼å¼ï¼št_(表å/视图å)_(before/after)_(insert/update/delete)_自定义å—符串.
34--本例ä¸çš„建表规则:除了主键(è”åˆä¸»é”®)å—æ®µä¸å¯ä¸ºNULLï¼Œå…¶ä»–å—æ®µéƒ½å¯ä»¥ä¸ºNULL,大ä¸äº†è®¡ç®—出æ¥çš„æ•°æ®ä¸ºNULL.
35
36
37--原始数æ®è¡¨(æ•°æ®éƒ¨åˆ†1).
38CREATE TABLE IF NOT EXISTS raw_data_1(
39exchange TEXT NOT NULL,
40code TEXT NOT NULL,
41name TEXT NULL,
42price_tick REAL NULL,
43PRIMARY KEY(exchange, code)
44);
45
46--原始数æ®è¡¨(æ•°æ®éƒ¨åˆ†2).
47CREATE TABLE IF NOT EXISTS raw_data_2(
48exchange TEXT NOT NULL,
49code TEXT NOT NULL,
50l_close_px REAL NULL,
51PRIMARY KEY(exchange, code)
52);
53
54--ä¸é—´æ•°æ®è¡¨(由原始数æ®åŠ å·¥å‡ºæ¥).
55CREATE TABLE IF NOT EXISTS it_data( --[intermediate table][it][ä¸é—´è¡¨]
56exchange TEXT NOT NULL,
57code TEXT NOT NULL,
58name TEXT NULL,
59price_tick REAL NULL,
60l_close_px REAL NULL,
61upper_px REAL NULL,
62lower_px REAL NULL,
63i_decimal_places INTEGER NULL, --intermediate,ä¸é—´æ•°æ®,å°æ•°ä½æ•°.
64i_gain REAL NULL, --intermediate,ä¸é—´æ•°æ®,æ”¾å¤§å€æ•°.
65t_calc TINYINT NULL, --trigger,为了触å‘"触å‘器"è€Œè®¾ç½®çš„å—æ®µ.
66t_update TINYINT NULL, --trigger,为了触å‘"触å‘器"è€Œè®¾ç½®çš„å—æ®µ.
67PRIMARY KEY(exchange, code)
68);
69
70--ç›®æ ‡æ•°æ®è¡¨(ç”±ä¸é—´æ•°æ®ç”Ÿæˆ).
71CREATE TABLE IF NOT EXISTS target_data(
72exchange TEXT NOT NULL,
73code TEXT NOT NULL,
74name TEXT NULL,
75price_tick REAL NULL,
76l_close_px REAL NULL,
77upper_px REAL NULL,
78lower_px REAL NULL,
79PRIMARY KEY(exchange, code)
80);
81
82--日志表.
83CREATE TABLE IF NOT EXISTS log_info(
84idx INTEGER PRIMARY KEY, --A column declared INTEGER PRIMARY KEY will autoincrement.
85dttm TIMESTAMP NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'now', 'localtime')),
86summary TEXT NOT NULL, --摘è¦
87details TEXT NULL --详情
88);
89
90
91--æ¤è§¦å‘器的作用:规定触å‘å™¨çš„ä¹¦å†™æ ¼å¼ï¼ŒéªŒè¯è§¦å‘å™¨é‡Œé¢æ— 法创建临时表.
92CREATE TRIGGER IF NOT EXISTS t_log_info_after_delete_buildfail
93AFTER DELETE
94ON log_info
95FOR EACH ROW
96WHEN (1=1) AND (3 NOTNULL) AND (NULL ISNULL)
97BEGIN
98 --(报错)触å‘å™¨é‡Œé¢æ— 法创建临时表.
99 CREATE TEMP TABLE kv(k TEXT NOT NULL PRIMARY KEY, v TEXT);
100 --(报错)SQLite没有FLOORã€CEILã€POWERå‡½æ•°ï¼ŒåŒæ—¶æœ‰ROUND函数.
101 SELECT FLOOR(5.175), CEIL(5.175), POWER(10, 2);
102 --(æ£ç¡®)è¾“å‡ºæ ¼å¼:YYYY-MM-DD HH:MM:SS.
103 SELECT DATETIME('now','localtime');
104END;
105
106--表raw_data_1çš„([insert/update]*[ISNULL/NOTNULL])å…±4个触å‘器的作用:
107--ä¸ç®¡insert还是update,若itè¡¨æ²¡æœ‰æ¤æ•°æ®ï¼Œåˆ™insert它+触å‘计算.
108--ä¸ç®¡insert还是update,若it表å˜åœ¨æ¤æ•°æ®ï¼Œåˆ™update它+触å‘计算.
109--1. insertï¼Œæ— æ¤æ•°æ®ï¼Œinsert它,触å‘计算.
110CREATE TRIGGER t_raw_data_1_after_insert_notexist
111AFTER INSERT
112ON raw_data_1
113FOR EACH ROW
114WHEN (SELECT code FROM it_data WHERE exchange=NEW.exchange AND code=NEW.code LIMIT 1) ISNULL
115BEGIN
116 REPLACE INTO it_data(exchange,code,name,price_tick)VALUES(NEW.exchange,NEW.code,NEW.name,NEW.price_tick);
117 UPDATE it_data SET t_calc=1 WHERE exchange=NEW.exchange AND code=NEW.code;
118END;
119--2. updateï¼Œæ— æ¤æ•°æ®ï¼Œinsert它,触å‘计算.
120CREATE TRIGGER t_raw_data_1_after_update_notexist
121AFTER UPDATE
122ON raw_data_1
123FOR EACH ROW
124--如果ä¸ç”¨ LIMIT çš„è¯ï¼Œå¾—用 NOT IN 关键嗿‰è¡Œï¼Œè²Œä¼¼å› 为它返回的是一个列表.
125--WHEN NEW.code NOT IN (SELECT code FROM it_data WHERE exchange=NEW.exchange AND code=NEW.code)
126--表达å¼(NEW.code!=NULL)的值为NULL.
127--WHEN NEW.code!=(SELECT code FROM it_data WHERE exchange=new.exchange AND code=new.code LIMIT 1)的写法是错误的.
128WHEN (SELECT code FROM it_data WHERE exchange=NEW.exchange AND code=NEW.code LIMIT 1) ISNULL
129BEGIN
130 REPLACE INTO it_data(exchange,code,name,price_tick)VALUES(NEW.exchange,NEW.code,NEW.name,NEW.price_tick);
131 UPDATE it_data SET t_calc=1 WHERE exchange=NEW.exchange AND code=NEW.code;
132END;
133--3. insert,有数æ®ï¼Œupdate它,触å‘计算.
134CREATE TRIGGER t_raw_data_1_after_insert_exist
135AFTER INSERT
136ON raw_data_1
137FOR EACH ROW
138WHEN (SELECT code FROM it_data WHERE exchange=NEW.exchange AND code=NEW.code LIMIT 1) NOTNULL
139BEGIN
140 --除了主键之外,è¦å°†NEWä¸å‰©ä½™çš„æ‰€æœ‰å—段都updateè¿›it_data表ä¸.
141 --如果ä¸ç”¨UPDATE,使用了INSERTçš„è¯ï¼Œå…¶ä»–表(raw_data_2)æ’入的值就丢了.
142 UPDATE it_data SET name=NEW.name,price_tick=NEW.price_tick WHERE exchange=NEW.exchange AND code=NEW.code;
143 UPDATE it_data SET t_calc=1 WHERE exchange=NEW.exchange AND code=NEW.code;
144END;
145--4. update,有数æ®ï¼Œupdate它,触å‘计算.
146CREATE TRIGGER t_raw_data_1_after_update_exist
147AFTER UPDATE
148ON raw_data_1
149FOR EACH ROW
150WHEN (SELECT code FROM it_data WHERE exchange=NEW.exchange AND code=NEW.code LIMIT 1) NOTNULL
151BEGIN
152 --除了主键之外,è¦å°†NEWä¸å‰©ä½™çš„æ‰€æœ‰å—段都updateè¿›it_data表ä¸.
153 UPDATE it_data SET name=NEW.name,price_tick=NEW.price_tick WHERE exchange=NEW.exchange AND code=NEW.code;
154 UPDATE it_data SET t_calc=1 WHERE exchange=NEW.exchange AND code=NEW.code;
155END;
156
157--表raw_data_2çš„(insert/update*ISNULL/NOTNULL)å…±4个触å‘器的作用:åŒä¸Š.
158--1. insertï¼Œæ— æ¤æ•°æ®ï¼Œinsert它,触å‘计算.
159CREATE TRIGGER t_raw_data_2_after_insert_notexist
160AFTER INSERT
161ON raw_data_2
162FOR EACH ROW
163WHEN (SELECT code FROM it_data WHERE exchange=NEW.exchange AND code=NEW.code LIMIT 1) ISNULL
164BEGIN
165 REPLACE INTO it_data(exchange,code,l_close_px)VALUES(NEW.exchange,NEW.code,NEW.l_close_px);
166 UPDATE it_data SET t_calc=1 WHERE exchange=NEW.exchange AND code=NEW.code;
167END;
168--2. updateï¼Œæ— æ¤æ•°æ®ï¼Œinsert它,触å‘计算.
169CREATE TRIGGER t_raw_data_2_after_update_notexist
170AFTER UPDATE
171ON raw_data_2
172FOR EACH ROW
173WHEN (SELECT code FROM it_data WHERE exchange=NEW.exchange AND code=NEW.code LIMIT 1) ISNULL
174BEGIN
175 REPLACE INTO it_data(exchange,code,l_close_px)VALUES(NEW.exchange,NEW.code,NEW.l_close_px);
176 UPDATE it_data SET t_calc=1 WHERE exchange=NEW.exchange AND code=NEW.code;
177END;
178--3. insert,有数æ®ï¼Œupdate它,触å‘计算.
179CREATE TRIGGER t_raw_data_2_after_insert_exist
180AFTER INSERT
181ON raw_data_2
182FOR EACH ROW
183WHEN (SELECT code FROM it_data WHERE exchange=NEW.exchange AND code=NEW.code LIMIT 1) NOTNULL
184BEGIN
185 --除了主键之外,è¦å°†NEWä¸å‰©ä½™çš„æ‰€æœ‰å—段都updateè¿›it表ä¸.
186 UPDATE it_data SET l_close_px=NEW.l_close_px WHERE exchange=NEW.exchange AND code=NEW.code;
187 UPDATE it_data SET t_calc=1 WHERE exchange=NEW.exchange AND code=NEW.code;
188END;
189--4. update,有数æ®ï¼Œupdate它,触å‘计算.
190CREATE TRIGGER t_raw_data_2_after_update_exist
191AFTER UPDATE
192ON raw_data_2
193FOR EACH ROW
194WHEN (SELECT code FROM it_data WHERE exchange=NEW.exchange AND code=NEW.code LIMIT 1) NOTNULL
195BEGIN
196 --除了主键之外,è¦å°†NEWä¸å‰©ä½™çš„æ‰€æœ‰å—段都updateè¿›it表ä¸.
197 UPDATE it_data SET l_close_px=NEW.l_close_px WHERE exchange=NEW.exchange AND code=NEW.code;
198 UPDATE it_data SET t_calc=1 WHERE exchange=NEW.exchange AND code=NEW.code;
199END;
200
201--æ¤è§¦å‘器的作用:当t_calc被修改时,触å‘计算的触å‘器,计算完毕åŽï¼Œæ›´æ–°t_updateå—æ®µ.
202--如果æ¤è§¦å‘器仅仅是AFTER UPDATE,并没有指定列,那么æ¤è§¦å‘器在è¿è¡Œè¿‡ç¨‹ä¸ï¼Œä¼šä¿®æ”¹è‡ªå·±çš„那一行的数æ®ï¼Œå¯èƒ½è¿˜ä¼šè§¦å‘è‡ªå·±ï¼Œå¯¼è‡´é”™è¯¯ï¼Œæ‰€ä»¥è¦æœ‰ä¸€ä¸ªä¸“门的列æ¥è§¦å‘本触å‘器.
203CREATE TRIGGER t_it_data_after_update_t_calc
204AFTER UPDATE OF t_calc --t_calcå—æ®µç”¨äºŽè§¦å‘计算.
205ON it_data
206FOR EACH ROW
207WHEN (NEW.price_tick NOTNULL) AND (NEW.l_close_px NOTNULL)
208BEGIN
209 --è®¡ç®—æœ‰å‡ ä½å°æ•°.
210 UPDATE it_data SET i_decimal_places=LENGTH(RTRIM(NEW.price_tick,' 0'))-LENGTH(REPLACE(NEW.price_tick,'.','_')/1)-1 WHERE exchange=NEW.exchange AND code=NEW.code;
211 --è®¡ç®—æ”¾å¤§å€æ•°.
212 UPDATE it_data SET i_gain=(CASE (SELECT i_decimal_places FROM it_data WHERE exchange=NEW.exchange AND code=NEW.code LIMIT 1)
213 WHEN 0 THEN 1
214 WHEN 1 THEN 10
215 WHEN 2 THEN 100
216 WHEN 3 THEN 1000
217 WHEN 4 THEN 10000
218 WHEN 5 THEN 100000
219 WHEN 6 THEN 1000000
220 ELSE 1 END) WHERE exchange=NEW.exchange AND code=NEW.code;
221 --计算涨åœä»·.
222 UPDATE it_data SET upper_px=REPLACE(NEW.l_close_px*1.1*(SELECT i_gain FROM it_data WHERE exchange=NEW.exchange AND code=NEW.code LIMIT 1)+0.5, '.', '_'
223 )*1.0/(SELECT i_gain FROM it_data WHERE exchange=NEW.exchange AND code=NEW.code LIMIT 1)
224 WHERE exchange=NEW.exchange AND code=NEW.code;
225 --计算跌åœä»·.
226 UPDATE it_data SET lower_px=REPLACE(NEW.l_close_px*0.9*(SELECT i_gain FROM it_data WHERE exchange=NEW.exchange AND code=NEW.code LIMIT 1)+0.5, '.', '_'
227 )*1.0/(SELECT i_gain FROM it_data WHERE exchange=NEW.exchange AND code=NEW.code LIMIT 1)
228 WHERE exchange=NEW.exchange AND code=NEW.code;
229 --æ›´æ–°t_updateå—æ®µ.
230 UPDATE it_data SET t_update=1 WHERE exchange=NEW.exchange AND code=NEW.code;
231END;
232
233--æ¤è§¦å‘器的作用:当t_updateè¢«ä¿®æ”¹æ—¶ï¼Œè§¦å‘æ›´æ–°çš„触å‘å™¨ï¼Œå°†æ•°æ®æ›´æ–°åˆ°ç›®æ ‡è¡¨.
234CREATE TRIGGER t_it_data_after_update_t_update
235AFTER UPDATE OF t_update --t_updateå—æ®µç”¨äºŽè§¦å‘æ›´æ–°æ•°æ®.
236ON it_data
237FOR EACH ROW
238BEGIN
239 REPLACE INTO target_data(exchange,code,name,price_tick,l_close_px,upper_px,lower_px)VALUES(NEW.exchange,NEW.code,NEW.name,NEW.price_tick,NEW.l_close_px,NEW.upper_px,NEW.lower_px);
240END;
241
242
243--清空å„个表:
244DELETE FROM raw_data_1;
245DELETE FROM raw_data_2;
246DELETE FROM it_data;
247DELETE FROM target_data;
248DELETE FROM log_info;
249--查询å„个表:
250SELECT * FROM raw_data_1;
251SELECT * FROM raw_data_2;
252SELECT * FROM it_data;
253SELECT * FROM target_data;
254SELECT * FROM log_info;
255--å¾€log_info里é¢å†™æ—¥å¿—çš„è¯å¥:
256REPLACE INTO log_info(summary,details)VALUES("some_summary",'some_details');
257--测试è¯å¥1:
258REPLACE INTO raw_data_1(exchange,code,name,price_tick)VALUES('SSE','600000','PFYH',0.01);
259REPLACE INTO raw_data_2(exchange,code,l_close_px) VALUES('SSE','600000',5.75);
260--测试è¯å¥2:
261REPLACE INTO raw_data_1(exchange,code,name,price_tick)VALUES('SZSE','000001','PAYH',0.01);
262REPLACE INTO raw_data_2(exchange,code,l_close_px) VALUES('SZSE','000001',10.25);
263
264```