|
我有下表,其中的表translation是空的,我正在尝试填充:
1 ^. v; i& I6 l% y) Q p& ]/ |. V0 wtranslation { U: w& f: E9 R/ G. @( ^! g
id
6 a K+ W: E. e3 z0 U& ]# M z translated+ C9 ^8 R+ e* D5 ^, w& i# M
language_id
' j# R. L% D) M$ ]8 _1 n. g template_id- A" N/ }& d3 q$ k: c4 `
}
% t- g+ J) Y0 }( q* G/ \language {+ [- ^) M5 k. y# U/ S" u
id. y h8 L9 a; q# C
langname
3 x8 i, |! ~7 a9 p2 }- ^ langcode
* ~ w1 o5 {; x& l9 Z, H9 {" j}
p/ m" f& _1 o3 U+ }; A7 D+ ztemplate {1 `4 Y/ o4 R; Q
id+ V* x5 S5 z0 x" e8 P, f
tplname
& T$ [$ ]8 \, p: ~) l3 \& D$ j/ X source
' |* N# I( i- r" C$ e0 q/ d* I domain0 C# }5 m1 S4 Z# u1 E
total
+ `1 H0 J; L6 t8 u}
; Y+ f' n) }1 x+ w' B要填充的源数据translation是我从外部CSV文件填充的临时表:0 b4 g3 y# t2 ~9 K4 `$ Y
tmp_table {
$ Q! D" S2 U# n v3 p, ]. y! S id
8 I, b2 g) S9 v" ^9 ] translated& p8 U6 W) U4 L; w1 k# T" I
langname* r1 I- l, M$ @/ E( L$ y' f; r
tplname
3 f* @' {' Y% g6 O source
6 p" I5 g# w5 i, `9 ~: j" ] domain
, w* h# i0 w9 C2 \, s}
& f6 @0 r( R8 O4 l我想做的是translation用中的值填充tmp_table。该translated字段可以直接复制,但是我不太确定如何获取正确的内容language_id(可以使用tmp_table.langname确定language.id)和template_id(tmp_table.tplname,tmp_table.source,tmp_table.domain一起使用)确定template.id)。
# e% w5 @: j/ J& c. U. L9 T这可能是一个琐碎的问题,但是我对SQL还是很陌生,因此不确定填充translation表的最佳查询是什么。有任何想法吗?
7 V" T, H- m5 K" o $ p- [2 c7 f/ E/ T
解决方案:- F1 L0 \2 b! w
% Y2 }- Q# a5 p9 y s- Q- g7 s, Z
; ` X5 x* G a 可以简化为:0 ?0 ~, F4 q, I( `5 K u3 V
INSERT INTO translation (id, translated, language_id, template_id). A" ^* J# w- `1 a: e! K
SELECT tmp.id, tmp.translated, l.id, t.id
. G( D3 g4 Q& A# x9 J" T o! ?FROM tmp_table tmp F( r. q+ w1 o# k
JOIN language l USING (langname)) g/ e6 A+ T" v) D
JOIN template t USING (tplname, source, domain)
- c. p" K: p, h3 N5 eORDER BY tmp.id
1 d1 t% S7 w' e我添加了一个ORDER BY您严格不需要的子句,但是如果您以这种方式(或其他方式)插入集群数据,则某些查询可能会受益。
: e5 G5 d6 f! ?3 J如果您想避免丢失在language或中找不到匹配行的行template,请使其 LEFT JOIN6 x% h( r! d% N! n b; h
代替JOIN两个表(前提是language_id和template_id可以为)NULL。* f9 q5 f% R7 N
除了我已经在先决问题下列出的内容之外:如果INSERT很大并且在目标表中占很大的比例,那么/ H, i) ?# c. N1 p, y9 {9 x
删除 目标表上的 所有索引 并随后重新创建它们可能会更快。从头开始创建索引 要 快得多,然后每行都将对其进行增量更新。" d( ] I, p$ h: w+ k3 R3 o8 {
唯一索引还充当约束,因此您必须考虑是稍后执行规则还是将规则留在原地。 |
|