回答

收藏

如何从其他表填充表的外键

技术问答 技术问答 200 人阅读 | 0 人回复 | 2023-09-14

我有下表,其中的表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 {
唯一索引还充当约束,因此您必须考虑是稍后执行规则还是将规则留在原地。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则