[SQL] UNIQUE KEY und ON DUPLICATE KEY UPDATE

Dieses Thema im Forum "Webentwicklung" wurde erstellt von cable, 25. Oktober 2012 .

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 25. Oktober 2012
    UNIQUE KEY und ON DUPLICATE KEY UPDATE

    Hey,

    kurze Frage zum Thema MySQL und ON DUPLICATE KEY UPDATE.

    Ich habe folgende Tabelle in meiner Datenbank:
    Code:
    CREATE TABLE IF NOT EXISTS `users_apisessions` (
     `id` int(11) NOT NULL AUTO_INCREMENT,
     `user_guid` bigint(20) unsigned NOT NULL,
     `site_guid` bigint(20) unsigned NOT NULL,
     `token` varchar(40) DEFAULT NULL,
     `expires` int(11) NOT NULL,
     PRIMARY KEY (`id`),
     UNIQUE KEY `user_guid` (`user_guid`,`site_guid`),
     KEY `token` (`token`)
    ) ENGINE=MEMORY DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
    Wenn ich nun ein Insert aufrufe mit einem ON DUPLICATE KEY UPDATE, inwieweit betrifft das nun die user_guid, bzw site_guid? Müssen beide identisch sein, damit kein INSERT sondern ein UPDATE stattfindet?
    Also der Code schaut so aus:
    PHP:
    insert_data ( "INSERT into users_apisessions
                    (user_guid, site_guid, token, expires) values
                    (
    { $user -> guid } $site_guid , ' $token ', ' $time ') on duplicate key update token=' $token ', expires=' $time '" )
    Sagen wir, es gibt schon ein Token in der Tabelle mit einer user_guid und site_guid und ich will denselben einfügen. Wird dann der alte einfach geupdated?

    greez
     
  2. 25. Oktober 2012
    AW: UNIQUE KEY und ON DUPLICATE KEY UPDATE

    Ja, beide müssen identisch sein, damit ein UPDATE auf den bestehenden Datensatz gemacht wird.
    Wenn auch nur einer der beiden Werte anders ist (also kein Datensatz mit gleicher user_guid und site_guid existiert), wird ein INSERT gemacht..

    Beweis:
    Spoiler
    Code:
    mysql> CREATE TABLE IF NOT EXISTS `users_apisessions` (
     -> `id` int(11) NOT NULL AUTO_INCREMENT,
     -> `user_guid` bigint(20) unsigned NOT NULL,
     -> `site_guid` bigint(20) unsigned NOT NULL,
     -> `token` varchar(40) DEFAULT NULL,
     -> `expires` int(11) NOT NULL,
     -> PRIMARY KEY (`id`),
     -> UNIQUE KEY `user_guid` (`user_guid`,`site_guid`),
     -> KEY `token` (`token`)
     -> ) ENGINE=MEMORY DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> INSERT into users_apisessions (user_guid, site_guid, token, expires) VALUES (1, 1, 'XXXXX', '2012') on duplicate key update token='XXXXX', expires='2012';
    Query OK, 1 row affected (0.00 sec)
    
    mysql> SELECT * FROM users_apisessions;
    +----+-----------+-----------+-------+---------+
    | id | user_guid | site_guid | token | expires |
    +----+-----------+-----------+-------+---------+
    | 1 | 1 | 1 | XXXXX | 2012 |
    +----+-----------+-----------+-------+---------+
    1 row in set (0.00 sec)
    
    mysql> INSERT into users_apisessions (user_guid, site_guid, token, expires) VALUES (1, 1, 'ZZZZZZ', '2001') on duplicate key update token='ZZZZZZ', expires='2001';
    Query OK, 2 rows affected (0.00 sec)
    
    mysql> SELECT * FROM users_apisessions;
    +----+-----------+-----------+--------+---------+
    | id | user_guid | site_guid | token | expires |
    +----+-----------+-----------+--------+---------+
    | 1 | 1 | 1 | ZZZZZZ | 2001 |
    +----+-----------+-----------+--------+---------+
    1 row in set (0.00 sec)
    
    mysql> INSERT into users_apisessions (user_guid, site_guid, token, expires) VALUES (1, 2, 'WWWWW', '2003') on duplicate key update token='WWWWW', expires='2003';
    Query OK, 1 row affected (0.00 sec)
    
    mysql> SELECT * FROM users_apisessions;
    +----+-----------+-----------+--------+---------+
    | id | user_guid | site_guid | token | expires |
    +----+-----------+-----------+--------+---------+
    | 1 | 1 | 1 | ZZZZZZ | 2001 |
    | 2 | 1 | 2 | WWWWW | 2003 |
    +----+-----------+-----------+--------+---------+
    2 rows in set (0.00 sec)
    
    mysql> INSERT into users_apisessions (user_guid, site_guid, token, expires) VALUES (2, 2, 'AAAAA', '2005') on duplicate key update token='AAAAA', expires='2005';
    Query OK, 1 row affected (0.00 sec)
    
    mysql> SELECT * FROM users_apisessions;
    +----+-----------+-----------+--------+---------+
    | id | user_guid | site_guid | token | expires |
    +----+-----------+-----------+--------+---------+
    | 1 | 1 | 1 | ZZZZZZ | 2001 |
    | 2 | 1 | 2 | WWWWW | 2003 |
    | 3 | 2 | 2 | AAAAA | 2005 |
    +----+-----------+-----------+--------+---------+
    3 rows in set (0.00 sec)
    
    

    Ja, wenn eben die user_guid und die site_guid des neuen Tokens identisch mit dem bestehenden Datensatz ist.
     
    1 Person gefällt das.
  3. 25. Oktober 2012
    AW: UNIQUE KEY und ON DUPLICATE KEY UPDATE

    Hatte es vorhin auch mal ausprobiert. Hast Recht und danke für deinen Beitrag. Danke!

    greez
     
  4. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.