2010-08-08 7 views
5

Betrachten Sie die folgende Tabelle:Wie verhindere ich, dass MySQL den Primärschlüssel bei Verwendung von ON DUPLICATE KEY UPDATE automatisch inkrementiert, wenn das Duplikat eine andere eindeutige Spalte ist?

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

Ich habe folgende MySQL-Abfrage:

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

Die Absicht dieser Abfrage ist, einen neuen Herstellernamen in der Tabelle und im Falle Name bereits der Anbieter einfügen existiert, sollte die Spaltenanzahl um 1 erhöht werden. Dies funktioniert jedoch, der Primärschlüssel der aktuellen Spalte wird ebenfalls automatisch inkrementiert. Wie kann ich verhindern, dass MySQL in diesen Fällen den Primärschlüssel automatisch inkrementiert? Gibt es eine Möglichkeit, dies mit einer Abfrage zu tun?

Vielen Dank.

+0

verwenden Sie eine beliebige Sprache (wie PHP)? für die Umsetzung des Prozesses? – srinivas

+0

Ja, ich verwende PHP, um die Daten an anderer Stelle abzurufen und sie mit dieser Abfrage in meine Tabelle einzufügen. – vascaino

Antwort

1

Dies funktioniert aber der Primärschlüssel der aktuellen Spalte wird auch automatisch inkrementiert. Wie kann ich verhindern, dass MySQL in diesen Fällen den Primärschlüssel automatisch inkrementiert?

Durch die Verwendung einer UPDATE-Anweisung, wenn der Wert bereits vorhanden ist:

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 

ich die Alternative zu ON DUPLICATE KEY UPDATE versucht, REPLACE INTO:

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

Es aktualisiert die Zählung und die Vendor_id so ist es schlechter ...

Die Datenbank & Daten ist es egal, wenn die Zahlen nicht sind sequentiell, nur dass die Werte eindeutig sind. Wenn Sie damit leben können, würde ich die ON DUPLICATE UPDATE-Syntax verwenden, obwohl ich zugeben muss, dass das Verhalten seltsam ist (verständlich angesichts der Verwendung einer INSERT-Anweisung).

1

Ich denke, das könnte es tun. Aber es ist sehr gegen die Prinzipien des Daoismus - ihr geht wirklich gegen den Strich.

Es gibt wahrscheinlich eine bessere Lösung.

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