Announcement

Collapse
No announcement yet.

Error Code: 1062. Duplicate entry for key 'PRIMARY'

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Error Code: 1062. Duplicate entry for key 'PRIMARY'

    Hallo,

    In einer MySQL Tabelle, in der seit 2004 über 32500 Datensätze zusammengetragen wurden, gibt es ein INT - Feld, das auf AUTO_INCREMENT gesetzt ist, aber keinen Primary-Index, sondern nur einen Key hat. Ich würde das gern auf Primary setzen, aber dann gibt es etliche doppelte Einträge, weil mein Vorgänger anno 2007 offensichtlich eine Zeit lang einem Programmierfehler aufgesessen sein muß.


    Wie kann man alle mehrfach belegten Nummern auflisten?
    Wie kann man diesen Einträgen einen unbenutzten Wert zuzuweisen?

    Danke - Günther
    Günther

  • #2
    mit einer gruppierten Abfrage kann man die Duplikate abfragen

    select myKey, count(*) form myTable group by myKey where count(*) > 1

    Comment


    • #3
      Wie kann man alle mehrfach belegten Nummern auflisten?
      Fällt mir auf die Schnelle auch nichts ein. Ausser ein SELECT nach dem INT_Feld sortiert.
      Sind zwar eine Masse an Datensätzen, die man dann beackern muß, aber immerhin sind die bereits sortiert und man könnte da mit PHP was deichseln.
      Wie kann man diesen Einträgen einen unbenutzten Wert zuzuweisen?
      Neue Tabelle erstellen, bzw. die bestehende kopieren und den PRIMARY_KEY setzen/anpassen.
      Dann ein SELECT INTO von der alten in die neue Tabelle, mit expliziter Angabe der Spalten, damit der AUTO_INCREMENT greift.

      Die Frage ist nur, was das für Auswirkungen auf das dahinterliegende System hat, wenn die Keys anders nummeriert wurden!
      PHP rocks!
      Eine Initiative der PHP Community

      Comment


      • #4
        Originally posted by Arne Drews View Post
        Fällt mir auf die Schnelle auch nichts ein. Ausser ein SELECT nach dem INT_Feld sortiert.
        Sind zwar eine Masse an Datensätzen, die man dann beackern muß, aber immerhin sind die bereits sortiert und man könnte da mit PHP was deichseln.
        Nicht Dein Ernst jetzt, oder?
        COUNT(*), GROUP BY, HAVING, you know?


        Die Frage ist nur, was das für Auswirkungen auf das dahinterliegende System hat, wenn die Keys anders nummeriert wurden!

        Irrelevant, da eh keine referentielle Integrität vorhanden ist. Oder doch, in der Anwendung realisiert? Tja, Pech halt, gell? Ist ja jetzt auch im Eimer, da Werte doppelt da sind.

        Comment


        • #5
          Hallo,
          Originally posted by Bernhard Geyer View Post
          mit einer gruppierten Abfrage kann man die Duplikate abfragen
          Ja, dann muss die Bedingung aber auch in die HAVING-Klausel und nicht ins WHERE! Die WHERE-Bedingung wird VOR der Gruppierung geprüft, der Teil im HAVING erst danach, so dass dort auch Aggregatfunktionen verwendet werden können.
          [highlight=sql]
          select myKey, count(*)
          from myTable
          group by myKey
          having count(*) > 1
          [/highlight]
          Zum Thema "Wie kann man diesen Einträgen einen unbenutzten Wert zuzuweisen?":
          Was verstehst du unter "unbenutzt"? Der einfachste Weg wäre, wie von Arne beschrieben, dass Neuanlegen eines technischen Schlüssels als PK. Ggfs. kann danach das alte "INT-Feld" gelöscht werden, wenn die Daten tatsächlich nicht mehr benutzt werden.

          Gruß Falk

          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment


          • #6
            Originally posted by akretschmer
            Nicht Dein Ernst jetzt, oder?
            Hi Andreas, Ja ist mein Ernst
            Natürlich sind mir die Funktionen soweit bekannt, war mir nur grad nicht sicher, ob ich count in einer WHERE verwenden kann.
            Deshalb habe ich lieber keinen Blödsinn gepostet...
            PHP rocks!
            Eine Initiative der PHP Community

            Comment


            • #7
              Die Antwort von Falk hat super funktioniert. 205 doppelte Datensätze, je 2x.

              Die Lösung von Bernhard gibt einen Error 1064.

              Das von Arne hätte ich gemacht wenn hier niemand geantwortet hätte und ich auch nirgendwo anders eine Lösung gefunden hätte.

              Ach ja, für Frage 2 hat Arne ja einen guten Vorschlag gemacht, das werde ich noch ausprobieren.

              Danke - Günther
              Günther

              Comment

              Working...
              X