Mysql "безопасное" слияние - PullRequest
0 голосов
/ 09 апреля 2010

У меня есть таблица с неполными данными поля в каждой строке, которую я хочу исправить.

Вот что я имею в виду:

mysql> CREATE TABLE test (
       key INT
       a CHAR(1),
       b CHAR(1),
       c CHAR(1),
    );
mysql> CREATE TABLE test2 (
       key INT
       a CHAR(1),
       b CHAR(1),
       c CHAR(1),
    );
mysql> INSERT INTO test (1,'','','');
mysql> INSERT INTO test (2,'X','','');
mysql> INSERT INTO test (3,'','Y','');

mysql> INSERT INTO test2 (2,'X','','Z');
mysql> INSERT INTO test2 (4,'X','Y','Z');

Я бы хотел неразрушающим образом «объединить» данные test2 в тест на основе поля «ключ», чтобы:

  • если в тестируемом поле уже есть непустое значение для данного ключа, оно сохраняется.
  • если поле в тесте имеет пустое значение и соответствующее поле в test2 не пусто, значение из test2 заменяет соответствующее поле в тесте для данного ключа.
  • если поля в test и test2 не являются пустыми и отличаются, ничего не делать.

После «слияния» я хотел бы, чтобы данные таблицы «test» выглядели так:

(1,'','','');
(2,'X','','Z');
(3,'','Y','');
(4,'X','Y','Z');

Вроде как заполнение отверстий в тестовой таблице, без заусенцев.

Кто-нибудь может придумать, как это сделать?

1 Ответ

1 голос
/ 09 апреля 2010

MySQL имеет специальную функцию для этого случая:)

INSERT INTO test2 VALUES (2, 'X', '', 'Z')
ON DUPLICATE KEY UPDATE a='X', c='Z';
INSERT INTO test2 VALUES (4, 'X', 'Y', 'Z')
ON DUPLICATE KEY UPDATE a='X', b='Y', d='Z';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...