替换列为空字符串的行,但不包含已存在数据的行?

时间:2017-12-20 11:14:26

标签: mysql

我正在尝试将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)翻译。这有什么方法可行吗?

1 个答案:

答案 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