Как я могу запретить MySQL автоматически увеличивать первичный ключ при использовании ON DUPLICATE KEY UPDATE, когда дубликат - это другой уникальный столбец? - PullRequest
5 голосов
/ 08 августа 2010

Рассмотрим следующую таблицу:

+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| vendor_id   | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| vendor_name | varchar(100)     | NO   | UNI | NULL    |                |
| count       | int(10) unsigned | NO   |     | 1       |                |
+-------------+------------------+------+-----+---------+----------------+

У меня следующий запрос MySQL:

INSERT INTO `table` 
   (`vendor_name`) 
VALUES 
   ('foobar') ON DUPLICATE KEY UPDATE `count` = `count` + 1

Цель этого запроса - вставить имя нового поставщика в таблицу и весли имя поставщика уже существует, счетчик столбцов должен быть увеличен на 1. Это работает, однако первичный ключ текущего столбца также будет автоматически увеличен.Как я могу предотвратить MySQL от автоматического увеличения первичного ключа в этих случаях?Есть ли способ сделать это с помощью одного запроса?

Спасибо.

Ответы [ 2 ]

1 голос
/ 08 августа 2010

Я думаю, что это может сделать это.Но это очень противоречит принципам даосизма - вы действительно идете против зерна.

Возможно, есть лучшее решение.

INSERT INTO `table` 
   (`vendor_name`) 
VALUES 
   ('foobar') ON DUPLICATE KEY UPDATE `count` = `count` + 1, `vendor_id`=`vendor_id`-1
1 голос
/ 08 августа 2010

Это работает, однако первичный ключ текущего столбца также будет автоматически увеличен.Как я могу запретить MySQL автоматически увеличивать первичный ключ в этих случаях?

Используя инструкцию UPDATE, когда значение уже существует:

IF EXISTS(SELECT NULL
            FROM TABLE
           WHERE vendor_name = $vendor_name) THEN

    UPDATE TABLE
       SET count = count + 1
     WHERE vendor_name = $vendor_name

ELSE

    INSERT INTO TABLE
       (vendor_name)
    VALUES
       ($vendor_name

END IF

Я попробовал альтернативуON DUPLICATE KEY UPDATE, ЗАМЕНИТЕ НА:

REPLACE INTO vendors SET vendor_name = 'foobar', COUNT = COUNT + 1

Обновляет счетчик и vendor_id, так что это хуже ...

База данных и данные не заботятся, если цифры неПоследовательное, только то, что значения являются уникальными.Если бы вы могли жить с этим, я бы использовал синтаксис ON DUPLICATE UPDATE, хотя я признаю, что поведение странное (понятно, если использовать оператор INSERT).

...