2010-08-08 11 views
5

Tenga en cuenta la siguiente tabla:¿Cómo evito que MySQL aumente automáticamente la clave principal mientras usa ON DUPLICATE KEY UPDATE cuando el duplicado es una columna única diferente?

+-------------+------------------+------+-----+---------+----------------+ 
| 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  |    | 
+-------------+------------------+------+-----+---------+----------------+ 

tengo el siguiente MySQL consulta:

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

La intención de esta consulta es insertar un nuevo nombre del proveedor a la mesa y en el caso de que el nombre del proveedor ya existe, el recuento de columnas debe incrementarse en 1. Esto funciona, sin embargo, la clave principal de la columna actual también se incrementará automáticamente. ¿Cómo puedo evitar que MySQL aumente automáticamente la clave principal en estos casos? ¿Hay alguna manera de hacer esto con una consulta?

Gracias.

+0

¿Usas algún launguage (como PHP)? para implementar el proceso? – srinivas

+0

Sí, utilizo PHP para buscar los datos en otro lugar e insertarlos en mi tabla con esta consulta. – vascaino

Respuesta

1

Esto funciona, sin embargo, la clave principal de la columna actual también se autoincrementará. ¿Cómo puedo evitar que MySQL aumente automáticamente la clave principal en estos casos?

Mediante el uso de una instrucción UPDATE cuando el valor ya existe:

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 

Probé la alternativa en ON DUPLICATE KEY UPDATE, REPLACE INTO:

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

actualiza el recuento, y el proveedor_id así que es peor ...

La base de datos & datos no importa si los números no son secuencial, solo que los valores son únicos. Si puedes vivir con eso, usaría la sintaxis de ACTUALIZACIÓN DUPLICADA, aunque admito que el comportamiento es extraño (comprensible si se considera usar una instrucción INSERT).

1

Creo que esto podría hacerlo. Pero está muy en contra de los principios del Daoísmo: realmente vas contra corriente.

Probablemente haya una solución mejor.

INSERT INTO `table` 
    (`vendor_name`) 
VALUES 
    ('foobar') ON DUPLICATE KEY UPDATE `count` = `count` + 1, `vendor_id`=`vendor_id`-1 
Cuestiones relacionadas