Tabelle für Sequence

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

  • Tabelle für Sequence

    Hi,

    gibt es beim Anlegen einer Tabelle, speziell für den Wert einer Sequence was besonderes zu beachten? Ich habe bisher immer einen Int-Feld mit der Länge 11 genommen und auf das Feld einen Primärschlüssel gelegt. Das Erzeugen einer neuen Sequence mittels MDB2 von Pear funktioniere auch immer problemlos, da hat er ja auch die Tabelle selbst angelegt. Aber ich habe nun eine Anwendung die Zend_Db_Table anwendet und da habe ich ebenfalls die Sequence-Tabelle zum Erzeugen einer ID angegeben, jedoch generiert er keine neue ID.

    Kann das an der Tabellenstruktur liegen?

  • #2
    Wenn du mit "Sequenz" sowas wie den Autoincrement bei MySQL meinst, dann JA!
    Da alle "brauchbaren" DBMS das Konzept beherrschen, wird der Fehler in der Tabellendefinition liegen.
    Wir werden alle sterben

    Kommentar


    • #3
      Die Tabelle habe ich korrekt angelegt, aber es wird einfach keine Sequence erzeugt. Ist vielleicht an meinem Code etwas falsch?

      PHP-Code:
      require_once 'Zend/Db/Table.php';

      class 
      kunde extends Zend_Db_Table {
          protected 
      $_name             'adressen';
          protected 
      $_schema         'example';
          protected 
      $_primary     'AdressID';
          protected 
      $_sequence    'adressen_seq';
      }

      $options = array(
        
      'host'     => 'mysql5.test.de',
        
      'username' => 'example',
        
      'password' => 'example',
        
      'dbname'   => 'example'
      );

      $db Zend_Db::factory('Pdo_Mysql'$options);

      $tbl = new kunde($db);
      $tbl->insert(array('name' => 'Example')); 

      Kommentar


      • #4
        MySQL kennt keine Sequenz als einzelnes Objekt, wie man das vielleicht von PostgreSQL kennt, sondern eine Spalte besitzt das Attribut auto_increment. Wenn dies bei dir nicht der Fall ist, hast du den Fehler ja schon gefunden. Poste doch mal das SQL-Skript, mit dem du die Tabelle erstellst.

        Kommentar


        • #5
          Hi,

          hier das Script:
          PHP-Code:
          --
          -- 
          Tabellenstruktur für Tabelle `kunde_seq`
          --

          CREATE TABLE IF NOT EXISTS `kunde_seq` (
            `
          intint(11unsigned NOT NULL auto_increment,
            
          PRIMARY KEY  (`int`)
          ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=;

          --
          -- 
          Daten für Tabelle `kunde_seq`
          --

          INSERT INTO `kunde_seq` (`int`) VALUES
          (1); 

          Kommentar


          • #6
            Nein, ich meine deine adressen-Tabelle. Du benötigst in MySQL keine Extratabelle für die Sequenz. Du kannst in der einfachsten Form bereits dem Primärschlüssel AdressID das auto_increment-Attribut geben.

            Kommentar


            • #7
              Ich will aber bereits vor dem Insert wissen welche ID dem Datensatz zu geordnet wird. Und das ist nur möglich wenn ich eine Sequenz verwende. Und meines Wissens steht eine korrekte Sequenz immer in einer separaten Tabelle (kann mich aber auch irren, jedoch benötige ich eine extra Tabelle dafür). Bei MDB2 geht das ohne Probleme mit $db->nextid('tabellenname'); warum will das bei Zend_Db_Table nicht funzen... dachte mir das es unter Umständen an der Art der Tabelle liegt, aber offensichtlich ist es eine besondere Art und Weise von Zend...

              Kommentar


              • #8
                Wieso willst du das wissen? Wenn der Datensatz eingefügt wurde, kommst du an die zuletzt generierte ID. Das ist auch der übliche Weg. MDB2 wird mit ziemlicher Sicherheit den Wert MAX(sequence)+1 als nächste ID ermitteln, was im Falle von Race Conditions aber großer Blödsinn ist. Afaik hast du da keine andere Möglichkeit.
                Wozu benötigst du für die IDs denn eine Extratabelle?

                Kommentar


                • #9
                  Du hast deine Frage ja schon beantwortet bekommen. Sowohl hier im Forum wie auch hier und wer weiß in wieviel anderen Cross-Postings.

                  MySQL unterstützt keine Sequenzen.
                  Zend bietet die Routinen dafür an, weil das Zend-Framework mit vielen anderen Datenbanken (die teilweise auch Sequenzen unterstützen) genutzt werden kann.
                  Da du dich für MySQL entschieden hast, stehen dir die Sequenzen NICHT zur Verfügung.
                  Du müsstest also eine andere Datenbank nehmen oder konsequent mit auto_increment arbeiten.
                  Oder du erweiterst deine Zend_db_table um eine Funktion, die vielleicht eine Sequenz "simuliert".
                  Vielleicht reicht es ja auch schon, die max(id) aus der Spalte des auto_increments auszulesen.
                  Sequenzen stehen dir jedenfalls, auch trotz Zend, in MySQL nicht zur Verfügung.

                  Kommentar

                  Lädt...
                  X