我正在尝试将2500行数据添加到标签及其翻译表中。 对于某些标签我们已经在表格中有翻译,我想保留这些翻译,因为它们是手动制作的,更可能是正确的。但是,如果没有翻译,我想添加新的翻译。
数据库的外观如下:
Lan locale label translation
ar es_AR Crane
bg bg_BG Crane
cs cs_CZ Crane
de de_DE Crane Ladekran
ee et_EE Crane
el el_GR Crane
en en_GB Crane Crane
es es_ES Crane Grúa
fr fr_FR Crane Grue
hr hr_HR Crane
hu hu_HU Crane
it it_IT Crane Gru
lt lt_LT Crane
lv lv_LV Crane
nl nl_NL Crane Laadkraan
pl pl_PL Crane Dźwig
pt pt_PT Crane Guindaste
ro ro_RO Crane Macara
ru ru_RU Crane
sk sk_SK Crane
tr tr_TR Crane
uk uk_UA Crane
xk sq_XK Crane
这是我对同一标签的翻译:
INSERT IGNORE INTO translation
(`lan`,`locale`,`label`,`translation`)
VALUES
('en','en_GB','crane','Crane')
('nl','nl_NL','crane','Kraan')
('de','de_DE','crane','Kran')
('ru','ru_RU','crane','Подъёмный кран')
('es','es_ES','crane','Grúa')
('fr','fr_FR','crane','Grue')
('hr','hr_HR','crane','Kran')
('it','it_IT','crane','Gru')
('pl','pl_PL','crane','Dźwig')
('pt','pt_PT','crane','Grua')
('ro','ro_RO','crane','Macara')
('bg','bg_BG','crane','Кран')
('ar','es_AR','crane','رافعة')
理想情况下,我想添加BG,HR,HU,RU翻译。并保留已经存在的(例如DE)翻译。这有什么方法可行吗?
答案 0 :(得分:1)
其中一个解决方案是存储需要插入临时表的记录。
然后将此表与原始表连接,并使用连接运行插入和更新查询。
以下列方式:
INSERT INTO translation_temp
(`lan`,`locale`,`label`,`translation`)
VALUES
('en','en_GB','crane','Crane')
('nl','nl_NL','crane','Kraan')
('de','de_DE','crane','Kran')
('ru','ru_RU','crane','Подъёмный кран')
('es','es_ES','crane','Grúa')
('fr','fr_FR','crane','Grue')
('hr','hr_HR','crane','Kran')
('it','it_IT','crane','Gru')
('pl','pl_PL','crane','Dźwig')
('pt','pt_PT','crane','Grua')
('ro','ro_RO','crane','Macara')
('bg','bg_BG','crane','Кран')
('ar','es_AR','crane','رافعة');
插入另一张表后。
现在我们的第一步是添加缺失的行,为此我们可以按照以下方式进行左连接,
INSERT INTO translation
SELECT
tempo.lan, tempo.locale, tempo.label, tempo.translation
translation_temp ttemp
LEFT JOIN
translation torg
ON
torg.lan = ttemp.lan
AND
torg.locale = tempo.locale
AND
torg.label = tempo.label
WHERE
torg.lan IS NULL
# TO find there is no row for that temp table row in our original table
现在我们只需更新连接中列的值,其中原始表中的转换为空白
UPDATE
translation torg
INNER JOIN
translation_temp ttemp
ON
torg.lan = ttemp.lan
AND
torg.locale = tempo.locale
AND
torg.label = tempo.label
SET
torg.translation = tempo.translation
WHERE
torg.translation IS NULL OR torg.translation = ''
这应该有效,这取决于需要在什么情况下完成,对于一次性过程,您可以为此查询创建迁移脚本,并且为了多次使用,您需要为此过程创建SP,这可能是重复使用。
注意:
对于缺少的元素,我们使用LEFT JOIN
为了更新数据,我们正在使用INNER JOIN