Linuchs: nachträglich PRIMARY KEY setzen

Moin,

habe vergessen, einen PRIMARY KEY zu definieren.

133 Datensätzen habe ich die id = 1 .. 133 verpasst und dann in phpMyAdmin

ALTER TABLE `fsd_adressen` CHANGE `id` `id` INT( 11 ) NOT NULL AUTO_INCREMENT

Fehlermeldung:

Key

Verstehe ich nicht, vorher blieb er bei 20 hängen.

Habe das Feld id gelöscht und neu angelegt. Klappt auch nicht, weil nun alle id den Wert 0 haben.

Wie geht das?

Linuchs

  1. Hallo K.H.,

    Du musst zuerst die Doubletten in der zukünftigen Unique-Spalte beseitigen, sonst klappts nicht.

    Beste Grüße
    Dein DBMS

    1. Hallo Tante DBMS,

      Du musst zuerst die Doubletten in der zukünftigen Uniq-Spalte beseitigen, sonst klappts nicht.

      Wie ich das OP gelesen habe, gab es die nicht.

      Bis demnächst
      Matthias

      --
      Du kannst das Projekt SELFHTML unterstützen,
      indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
    2. Uniq-Spalte

      Der beanstandete doppelte Wert ist nicht doppelt. Mit

      select * from ... where id = 64
      

      gibt es genau einen Treffer. Gilt für alle id.

      Das Feld zugriffscodeenthält auch unique-Werte und ich kann es als INDEX-Key anlegen, aber nicht ändern auf UNIQUE.

      Jetzt im eigenen Programm (nicht phpMyAdmin):

            $q = "
      SELECT  *
      FROM    `shanty`.`fsd_adressen`
      WHERE   zugriffscode  =  '570 111 400'
      ";
            $res_setid = mysql_query( $q, $conn_id ); zeigSqlFehler( $q, $conn_id );
            echo "<pre>zugriffscode  '570 111 400' ist " . @mysql_num_rows($res_setid) . " mal vorhanden.</pre>";
            if ( @mysql_num_rows($res_setid) == 1 ) {
              $q = "
      ALTER TABLE `shanty`.`fsd_adressen` DROP INDEX `zugriffscode`, ADD UNIQUE `zugriffscode` (`zugriffscode`) USING BTREE";
              $res_setid = mysql_query( $q, $conn_id ); zeigSqlFehler( $q, $conn_id );
            }
      

      Antwort:

      zugriffscode  '570 111 400' ist 1 mal vorhanden.
      
      ALTER TABLE `shanty`.`fsd_adressen` DROP INDEX `zugriffscode`, ADD UNIQUE `zugriffscode` (`zugriffscode`) USING BTREE
      
      1062: Duplicate entry '570 111 400' for key 'zugriffscode'
      

      Kann da irgendwas mit der Tabelle nicht stimmen?

      Linuchs

      1. Habe den Fehler gefunden.

        Der Zugriffscode kommt aus einer Kunden-Datei und der war doppelt, was ich nicht erwarten konnte.

        1. nicht der Code 570 111 400 ist doppelt, sondern ein anderer. Die Fehlermeldung ist mir unverständlich.

          Aber vielleicht ist heute nicht mein Tag.

  2. Hallo Linuchs,

    ALTER TABLE `fsd_adressen` CHANGE `id` `id` INT( 11 ) NOT NULL AUTO_INCREMENT
    

    Fehlermeldung: […]

    Fehlermeldungen solltest du sinnvollerweise als Text posten, nicht als Screenshot. Aber bist du ganz sicher dass du wirklich keine ID doppelt hast? Wenn SELECT id, count(id) as anz FROM tabelle GROUP BY id HAVING anz > 1 nichts ausgibt kannst du das ausschließen.

    Und wie genau sieht die Tabelle vorher aus (SHOW-CREATE-TABLE-Query)? Ich kann dein Problem so nicht nachvollziehen.

    Habe das Feld id gelöscht und neu angelegt. Klappt auch nicht, weil nun alle id den Wert 0 haben.

    Was genau hast du versucht? Wie so oft gibt es auch hierzu bei Stackoverflow eine Lösung:

    ALTER TABLE tabelle 
      ADD id int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
    

    Das ist allerdings auch genau das was mir Adminer als Query erzeugt wenn ich bei einer bestehenden Tabelle eine auto_increment-Spalte hinzufüge.

    Gruß,
    Tobias

    1. Fehlermeldungen solltest du sinnvollerweise als Text posten, nicht als Screenshot.

      Ist klar. Nur beim Markieren des Textes verschwindet er, bevor ich noch [Strg][C] machen kann. Weil die Fehlermeldung bei Klick ausgeblendet wird.

      Inzwischen weiß ich, dass ich die linke Maustaste (mit der ich markiert habe) nicht loslassen darf, sondern erst [Strg][C], dann loslassen.

      Fehler ist gfunden, Problem gelöst.

      Die Fehlermeldung 1062: Duplicate entry '570 111 400' for key 'zugriffscode' war entweder schwachsinnig (und hat mich auf die falsche Fährte geführt) oder heute ist nicht mein Tag.

      Der angeblich doppelte entry steht im letzten Datensatz der Tabelle.

    2. Hallo tk,

      ich habe mir erlaubt, das ins Wiki zu übernehmen (https://wiki.selfhtml.org/wiki/Datenbank/Primärschlüssel_nachträglich_setzen).

      Bis demnächst
      Matthias

      --
      Du kannst das Projekt SELFHTML unterstützen,
      indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
      1. Hallo Matthias,

        habe den PRIMERY KEY (aber nicht das Feld id) gelöscht und deine Zauberformel in phpMaAdmin ausprobiert:

        ALTER TABLE adressen ADD id INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST

        Meldung:

        #1060 - Duplicate column name 'id'

        Für das nicht vorhandene Feld id2 funktioniert das.

        Für ein neu anzulegendes Feld passt dann aber deine Formulierung nicht:

        „Voraussetzung ist, dass die Spalte, die zum Primärschlüssel werden soll, keine doppelten Werte enthält. Das prüfen Sie mit der Abfrage:“

        Wie sieht SQL aus, wenn eine vorhandene Spalte zum PRIMARY KEY werden soll?

        Linuchs

        Edit: Vorhandene Daten (z.B. Telefon) und AUTO_INCREMENT sind doch unmöglich, oder?

        1. Hallo Linuchs,

          Wie sieht SQL aus, wenn eine vorhandene Spalte zum PRIMARY KEY werden soll?

          ALTER TABLE `tabelle` 
            CHANGE `id` `id` INT NOT NULL AUTO_INCREMENT, 
            add PRIMARY KEY (`id`) 
          

          Bis demnächst
          Matthias

          --
          Du kannst das Projekt SELFHTML unterstützen,
          indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
        2. Hallo Linuchs,

          Edit: Vorhandene Daten (z.B. Telefon) und AUTO_INCREMENT sind doch unmöglich, oder?

          Doch das ist möglich, wenn es sich um einen zählbaren Datentyp handelt. Der neue Datensatz erhält dann die ID (bisheriger größter Wert +1).

          Bis demnächst
          Matthias

          --
          Du kannst das Projekt SELFHTML unterstützen,
          indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
          1. Hallo,

            Edit: Vorhandene Daten (z.B. Telefon) und AUTO_INCREMENT sind doch unmöglich, oder?

            Doch das ist möglich, wenn es sich um einen zählbaren Datentyp handelt. Der neue Datensatz erhält dann die ID (bisheriger größter Wert +1).

            Bei MySQL ist der nächste Autoincrement-Wert in den Kopfdaten der Tabelle eingetragen und muss nicht unbedingt auf den bisher größten Wert folgen.

            Man kann ihn über das INFORMATION_SCHEME ermitteln.
            Bei manchen DBMS lässt sich sowohl dieser Wert, als auch die Schrittweite einstellen.

            Bei MySQL fand ich auf die Schnelle leider nur diese Stelle im Handbuch

            Bis später
            Tante DBMS

            1. Hallo Tante,

              Bei MySQL ist der nächste Autoincrement-Wert in den Kopfdaten der Tabelle eingetragen und muss nicht unbedingt auf den bisher größten Wert folgen.

              Nicht nur da.

              Bei MS SQL Server ist das auch der Fall und man kann ihn nur mit einem extrem kryptischen Kommando, das auch nur ein absoluter DB Admin durchführen darf, verändern. Deswegen war ich beim Einstieg in diesen Thread auch erstmal total überrascht, dass Linuchs überhaupt nur einen halben Schritt weit gekommen ist. MySQL ist da offenbar etwas großzügiger...

              Rolf

              --
              sumpsi - posui - obstruxi