MySQL INSERT, если одно из значений первичного ключа не совпадает - PullRequest
0 голосов
/ 24 марта 2011

Я бы хотел выполнить запрос MySQL следующим образом:


if((value1 != dbPrimaryValue1) OR (value2 != dbPrimaryValue2))
      INSERT ROW
else
      DO NOTHING

Давайте попробуем пример:


CREATE TABLE `tmp` (
    `one` int NOT NULL,
    `two` int NOT NULL,
    `three` int NOT NULL);

ALTER TABLE `tmp`
ADD PRIMARY KEY (`one`, `two`);

INSERT INTO `tmp`
    (`one`, `two`, `three`)
    VALUES (1,2,3);

INSERT INTO `tmp`
    (`one`,`two`,`three`) 
    VALUES (10,20,30),
           (1,999,999),
       (999,2,999),
       (1,2,999)
    ON DUPLICATE KEY 
           UPDATE `one` = `one`; // or some dummy no-source-drain operation

Результат здесь:

<code>
select * from tmp;
+-----+-----+-------+
| one | two | three |
+-----+-----+-------+
|   1 |   2 |     3 |
|  10 |  20 |    30 |
|   1 | 999 |   999 |
| 999 |   2 |   999 |
+-----+-----+-------+

U хотел бы получить такой результат:


 select * from tmp;
+-----+-----+-------+
| one | two | three |
+-----+-----+-------+
|   1 |   2 |     3 |
|  10 |  20 |    30 |
+-----+-----+-------+

Возможно ли сделать этот запрос? Я работаю с огромными данными и процедурами вроде load -> Compare -> Save невозможно. СПАСИБО!

Ответы [ 2 ]

1 голос
/ 24 марта 2011

Просто сделайте оба поля уникальными по отдельности.Например:

CREATE TABLE `tmp` (
    `one` int NOT NULL UNIQUE,
    `two` int NOT NULL UNIQUE,
    `three` int NOT NULL);

Или добавьте ограничения с помощью:

ALTER TABLE `tmp` ADD UNIQUE (`one`);
ALTER TABLE `tmp` ADD UNIQUE (`two`);
0 голосов
/ 24 марта 2011

Если вы создаете ограничение ключа UNIQUE, база данных не позволит вам автоматически вставить их.

С MySQL forum :

AИндекс UNIQUE создает такое ограничение, что все значения в индексе должны быть различны.При попытке добавить новую строку со значением ключа, совпадающим с существующей строкой, возникает ошибка.Для всех механизмов индекс UNIQUE допускает несколько значений NULL для столбцов, которые могут содержать NULL.

...