Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Anfänger: ERROR 1062 (23000): Duplicate entry '0' for key 'PRIMARY'

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von gutschy, 19 Januar 2014.

  1. gutschy

    gutschy Aktiver Benutzer

    Hallo Leute,

    versuche gerade ein Tutorial Beispiel nachzuvollziehen. Ich habe zuerst Daten aus einer Tabelle in eine TXT Datei kopiert. Dann die Tabelle geleert und anschließend den Inhalt aus der TXT Datei versucht wieder in die Tabelle einzuspielen. Das Resultat ist die Fehlermeldung aus der Überschrift. Hatte das Problem eher schon einmal mit einer Ignore Anweisung gelößt aber das kann es ja nicht sein auf Dauer.

    Hier mal meine Befehle:
    Code:
    mysql> DELETE FROM Cars;
    Query OK, 8 rows affected (0.00 sec)
    
    mysql> SELECT * FROM Cars;
    Empty set (0.01 sec)
    
    mysql> LOAD DATA INFILE '/tmp/cars.txt' INTO TABLE Cars FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
    ERROR 1062 (23000): Duplicate entry '0' for key 'PRIMARY'
    
    Und hier noch die Tabellenbeschreibung:
    Code:
    mysql> DESCRIBE Cars;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | Id    | int(11)     | NO   | PRI | NULL    |       |
    | Name  | varchar(50) | YES  |     | NULL    |       |
    | Cost  | int(11)     | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    3 rows in set (0.00 sec)
    Google hatte so einige Lösungsvorschläge aber irgendwie hat mich da mein Englisch verlassen. Scheint keine große Sache zu sein, oder?

    Gruss,

    Gutschy
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Noch mal zur Sicherheit: die Daten waren erst so in dieser Tabelle, ja? Oder ist die neu erstellt oder kommen die Daten von woanders her?
     
  3. gutschy

    gutschy Aktiver Benutzer

    Die Daten kommen genauso aus der Tabelle.
    Code:
    mysql> SELECT * INTO OUTFILE '/tmp/cars.txt' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n
    ' FROM Cars;
    Query OK, 8 rows affected (0.01 sec)
     
  4. akretschmer

    akretschmer Datenbank-Guru


    Gut, der Fehler ist eindeutig: im PK dürfen keine 2 gleichen Werte stehen. Beim Import merkt MySQL es. Wenn die Daten vorher so aus derselben Tabelle geholt wurden, hatte es also MySQL vorher nicht bemerkt.

    Soviel zum Thema Datenkonsistenz in MySQL.

    Könnt natürlich sein, Du hast den Export-Befehl mehrfach gemacht und das jedesmal an die Datei angehangen. Das schon geprüft?


    Ansonsten: wenn Du ernsthaft SQL lernen willst: nehm nicht MySQL.
     
  5. gutschy

    gutschy Aktiver Benutzer

    Erstmal Danke für deine schnelle Hilfe, akretschmer.
    Aber ich kann dir nicht ganz folgen. Hier mal die Tabelle:
    Code:
    1,Audi,52642
    
    2,Mercedes,57127
    
    3,Skoda,9000
    
    4,Volvo,29000
    
    5,Bentley,35000
    
    6,Citroen,21000
    
    7,Hummer,41400
    
    8,Volkswagen,21600
    
    Der PK ist schon mal in der Tabelle nicht doppelt. Wenn ich nach der Fehlermeldung die Tabelle aufrufe gibt es allerdings Einträge.
    Code:
    mysql> LOAD DATA INFILE '/tmp/cars.txt' INTO TABLE Cars FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
    ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
    mysql> SELECT * FROM Cars;
    +----+----------+-------+
    | Id | Name     | Cost  |
    +----+----------+-------+
    |  1 | Audi     | 52642 |
    |  0 | NULL     |  NULL |
    |  2 | Mercedes | 57127 |
    +----+----------+-------+
    3 rows in set (0.00 sec)
    
    mysql> DELETE FROM Cars;
    Query OK, 3 rows affected (0.00 sec)
    
    mysql> SELECT * FROM Cars;
    Empty set (0.00 sec)
    
    mysql> LOAD DATA INFILE '/tmp/cars.txt' INTO TABLE Cars FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
    ERROR 1062 (23000): Duplicate entry '0' for key 'PRIMARY'
    mysql> SELECT * FROM Cars;
    +----+----------+-------+
    | Id | Name     | Cost  |
    +----+----------+-------+
    |  1 | Audi     | 52642 |
    |  0 | NULL     |  NULL |
    |  2 | Mercedes | 57127 |
    +----+----------+-------+
    3 rows in set (0.00 sec)
    
    mysql> 
    Ich werde mal die Leerzeilen aus der cars.txt löschen.
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Entweder einer der vielen Bugs in MySQL, oder Fehler in Deinen Daten. Bei 8 Datensätzen wäre es relativ trivial, sich mit einem $EDITOR die cars.txt mal anzuschauen.
     
  7. gutschy

    gutschy Aktiver Benutzer

    Fehler gefunden.:rolleyes:
    Um es mit den Worten eines alten Bekannten/Admins zu sagen: Schuld ist immer der User.
    Code:
    mysql> SELECT * INTO OUTFILE '/tmp/cars.txt' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n
    ' FROM Cars;
    Query OK, 8 rows affected (0.01 sec)
    Es ist der Zeilenumbruch im Newline Zeichen, bin da ausversehen auf die Returntaste gekommen.

    Aber mach mir doch mal einen Vorschlag was besser als MySQL wäre, muß natürlich auf gängigen Servern laufen.
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Na - PostgreSQL. Deutlich mehr Features, bessere Lizenz. Was sind gängige Server?
     
  9. gutschy

    gutschy Aktiver Benutzer

    Hab gerade mal ein wenig überflogen was Google zu Postgre vs. MySQL anbietet. Postgre scheint im Moment besser darzustehen. Aber ich habe wirklich ein Zeitproblem und die Anwendung für die ich MySQL brauche ist wirklich simpel. Dann ist MySQL glaube ich auch besser dokumentiert. Also ich würde gerne bei Postgre ensteigen und gut zu wissen das es diese Datenbank gibt.

    Vielleicht werde ich in absehbarer Zeit ein Kundenverwaltung schreiben, dann werd ich Postgre auf jeden Fall versuchen zu benutzen.

    Mit Server war Apache gemeint, hätte ich auch schreiben können.

    Und nochmal danke für Hilfe.:)
     
  10. akretschmer

    akretschmer Datenbank-Guru

    Nun ja. Also ich halte http://www.postgresql.org/docs/current/interactive/ für ausgesprochen gut. Frei von Werbung oder anderem Gedöns. Statt current im Link kannst auch die Version einsetzen, also 9.1 oder 8.4 oder 9.3, dann landest Du direkt bei der Doku für diese Version. current ist immer die aktuelle, mit devel landest bei der kommenden Version. Auch die ist schon dokumentiert, sobald ein Feature commited ist - die Doku gehört halt zwingend dazu.
    Wenn man mal die Doku da quer gelesen hat und den Aufbau kennt, findest einklich immer alles sehr schnell.


    Daneben gibt es massig Blogs (gut, bei MySQL gibt es auch einige) und anderes - also die Doku finde ich mehr als ausreichend.


    Andreas
     
  11. gutschy

    gutschy Aktiver Benutzer

    Womit wir wieder beim madigen Englisch wären.:( Allerdings würde meins da wahrscheinlich doch noch ausreichen.

    Ausserdem mache ich gerade einen kompakt MySQL Kurs und das Kompakte ist gerade das was ich brauche. Das Ding hab ich hoffentlich zum WE durch.

    Andreas besten Dank noch mal aber heute wirst du mich nicht bekehren.

    Gruss,

    Michael
     
    akretschmer gefällt das.
  12. akretschmer

    akretschmer Datenbank-Guru

    Macht nix, kann ich mit leben.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden