Bei Update neues auto_increment vergeben lassen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Bei Update neues auto_increment vergeben lassen

    Hallo Leute,

    durch eine ungünstiges Datenbankdesign, um welches ich nicht herum komme ändere ich unter Umständen einen Primarykey, womit dann auch ein neues auto_increment vergeben werden muss. Ich weiss nur nicht wie.

    Hier die Datenbank

    Code:
    CREATE TABLE `client_template` (
      `clientid` int(11) NOT NULL,
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `skr` tinyint(2) NOT NULL,
      `category` int(11) NOT NULL DEFAULT '0',
      `name` text NOT NULL,
      `description` text NOT NULL,
      `account` text NOT NULL,
      `valid` date NOT NULL,
      `expire` date DEFAULT NULL,
      PRIMARY KEY (`clientid`,`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    Über Php kann je nach Bedarf die clientid, name und description geändert werden. Sofern die Clientid geändert wird, muss durch Mysql auch die id automatisch auf den nächsten auto_increment in Abhängigkeit der id geändert werden.

    Wie stelle ich das aber am besten an?

    Ich hoffe Ihr habt eine gut Lösung mit Mysql ohne das ich vorher alles mit PHP prüfen muss. Sonst müsste ich außer ein update ein select, delete und insert ausführen, was mir für ein so einfaches Vorhaben durch etwas überzogen scheint.

    Ich bin gespannt


    Apollon

  • #2
    Zitat von mr_apollon Beitrag anzeigen
    durch eine ungünstiges Datenbankdesign, um welches ich nicht herum komme
    Warum nicht? Ist das so schon vorhanden oder hast du keine Lust, das wieder umzubauen?
    Zitat von mr_apollon Beitrag anzeigen
    ändere ich unter Umständen einen Primarykey, womit dann auch ein neues auto_increment vergeben werden muss.
    Dein Primary Key besteht aus der Client-ID und der ID. Änderst du nur die Client-ID, hast du bereits einem neuen Primary Key. Da brauchst du die ID nicht auch zu ändern. Oder geht es da um Relationen, die du bisher verschwiegen hast?

    Mein Tipp. Gib der Client-ID ein UNIQUE, dann solte es passen. Auch wenn mir dein Datenbankdesign überhaupt nicht gefällt.

    Peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      Hallo,

      hab ich das richtig verstanden, dass du die Spalten id und clientid immer identisch halten willst/musst? Ansonsten erklär mal bitte, welche Spalte von beiden geändert werden muss und welche daraufhin angepasst werden soll. Du sprichst vom Ändern des Primärschlüssels, aber du hast einen Mehrfeldprimärschlüssel, deshalb ist nicht nachvollziehbar, welchen Wert du änderst. Ebenso ist nicht ganz klar, was du damit meinst, dass ein neues auto_increment vergeben werden muss. Das vergibt MySQL doch selbst.

      Gruß,

      Amica
      [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
      Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
      Super, danke!
      [/COLOR]

      Kommentar


      • #4
        Huhu,

        erstmal danke fürs anschauen. Ich versuch es mal zu erklären

        Jeder User (userid) kann beliebig viele persönliche Vorlagen (id) anlegen.
        (Die Information des Template liegen als json in der Spalte Account)
        => darum Mehrfeldprimärschlüssel

        Die erste userid für reale Benutzer ist 1. Globale Vorlagen die für alle User zur Verfügung stehen haben userid = 0. Jetzt soll es dem Admin möglich sein, einzelne Vorlagen einem anderen Benutzer zuzuordnen bzw. sie als global zu definieren.
        => userid wird geändert

        Beispiel:

        - der Benutzer mit der userid fünf legt die dritte persönliche Vorlage an
        => insert mit userid = 5 und mysql vergibt automatisch id = 3 (soweit so gut)
        - Administrator nimmt diese Vorlage und gibt sie global frei
        => Änderung: userid = 0

        Problem:

        Es gibt jetzt aber mit der userid = 0 schon viele id (also auch die id 3). Mysql müsste bei einem Update des Datensatzes (ändern der userid) entsprechend der userid eine neue freie id vergeben.

        Ist das möglich ohne subquery?

        ich würde es so lösen

        Code:
        UPDATE  client_template SET 
        clientid = '0',
        id = 
        (
          SELECT max_id FROM
          (
            SELECT MAX(id+1) as max_id FROM client_template where clientid = '0'
          ) 
         AS tmp
        )
        WHERE clientid = '5' AND id = '3';
        Finde ich aber nicht gerade elegant

        Kommentar


        • #5
          Wenn sich das wirklich nicht ändern lässt und du das so machen musst, reicht aber auch ein Subselect, nämlich das innere. Warum du dort nochmal eins drumherum gebaut hast, verstehe ich nicht.

          Wenn du doch die Möglichkeit hast, etwas an der DB zu ändern, tu es!
          [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
          Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
          Super, danke!
          [/COLOR]

          Kommentar


          • #6
            Da die Templates der einzelnen User eigene ID's haben sollen, komme ich wohl nicht um das Datenbankdesign rum

            Ich hoffte das es eine performantere Lösung zur Neuvergabe einer ID gibt, anstatt des subselect.

            Bette ich den eigentlichen subselect nicht nochmal in einen subselect ein, bringt Mysql den Fehler "You can't specify target table 'client_template' for update in FROM clause"

            Wie gesagt leider alles etwas unelegant...

            Kommentar


            • #7
              Zitat von mr_apollon Beitrag anzeigen
              Ich hoffte das es eine performantere Lösung zur Neuvergabe einer ID gibt, anstatt des subselect.
              Da sowas in der Praxis eigentlich nicht vorkommen kann (außer bei fehlerhaften Datenbanklayouts), ist so ein Funktion von MySQL vermutlich gar nicht vorgesehen.

              Kommentar


              • #8
                @mr_apollon
                warum speicherst du die Templates nicht in Ordnern ab? Die Templates haben dann immer denselben Namen nur die Ordner heißen anders. Zum Beispiel wie die Client-ID. Wenn die sich dann ändert, muss einfach nur der Ordner umbenannt werden und alles ist wieder feini feini.

                Peter
                Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
                Meine Seite

                Kommentar

                Lädt...
                X