Doppelte Einträge vermeiden, aber wie?

Dieses Thema im Forum "SQL und Datenbanken" wurde erstellt von flugopa, 09.10.2009.

  1. #1 flugopa, 09.10.2009
    flugopa

    flugopa Der lernwillige

    Dabei seit:
    27.05.2006
    Beiträge:
    739
    Zustimmungen:
    0
    Ort:
    München
    Hallo,

    ich lerne gerade mysql, wobei ich an den doppelten Einträgen "hänge", die ich nicht möchte. (Beispiel aus dem Internet kopiert und probiert)
    Code:
    mysql> CREATE TABLE `ftpuser` (
        ->   `id` int(3) NOT NULL auto_increment,
        ->   `username` varchar(60) character set latin1 collate latin1_bin default NULL,
        ->   `uid` int(11) default NULL,
        ->   `gid` int(11) default NULL,
        ->   `password` varchar(30) default NULL,
        ->   `homedir` varchar(250) default NULL,
        ->   PRIMARY KEY  (`id`)
        -> ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> LOAD DATA LOCAL INFILE '/root/ftpuser.csv' INTO TABLE ftpuser FIELDS TERMINATED BY ';';
    Query OK, 3 rows affected, 3 warnings (0.00 sec)
    Records: 3  Deleted: 0  Skipped: 0  Warnings: 0
    
    mysql> select * from ftpuser;
    +----+----------+-------+-------+----------+-----------+
    | id | username | uid   | gid   | password | homedir   |
    +----+----------+-------+-------+----------+-----------+
    |  1 | user1    | 10001 | 10011 | password | /home/ftp | 
    |  2 | user2    | 10002 | 10022 | password | /home/ftp | 
    |  3 | user3    | 10003 | 10033 | password | /home/ftp | 
    +----+----------+-------+-------+----------+-----------+
    3 rows in set (0.00 sec)
    
    mysql> LOAD DATA LOCAL INFILE '/root/ftpuser.csv' INTO TABLE ftpuser FIELDS TERMINATED BY ';';
    Query OK, 3 rows affected, 3 warnings (0.00 sec)
    Records: 3  Deleted: 0  Skipped: 0  Warnings: 0
    
    mysql> select * from ftpuser;
    +----+----------+-------+-------+----------+-----------+
    | id | username | uid   | gid   | password | homedir   |
    +----+----------+-------+-------+----------+-----------+
    |  1 | user1    | 10001 | 10011 | password | /home/ftp | 
    |  2 | user2    | 10002 | 10022 | password | /home/ftp | 
    |  3 | user3    | 10003 | 10033 | password | /home/ftp | 
    |  4 | user1    | 10001 | 10011 | password | /home/ftp | 
    |  5 | user2    | 10002 | 10022 | password | /home/ftp | 
    |  6 | user3    | 10003 | 10033 | password | /home/ftp | 
    +----+----------+-------+-------+----------+-----------+
    6 rows in set (0.00 sec)
    
    Wie sollte der zweite Aufruf aussehen damit es nicht zu einer Verdopplung der Einträge kommt.

    Irgendwie habe ich mal wieder Tomaten auf den Augen und sehe es nicht im folgenden link:
    http://dev.mysql.com/doc/refman/5.1/de/index.html
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. yai

    yai yet another idiot

    Dabei seit:
    22.01.2007
    Beiträge:
    166
    Zustimmungen:
    0
    versuchs mal mit
    load data infile 'filename' replace
    bye,
    yai
     
  4. #3 flugopa, 09.10.2009
    flugopa

    flugopa Der lernwillige

    Dabei seit:
    27.05.2006
    Beiträge:
    739
    Zustimmungen:
    0
    Ort:
    München
    Hallo yai,

    bin Dein Vorschlag gefolgt, aber ohne gewünschtes Ergebnis.
    (Vermeidung von doppelten Inhalten)


    Code:
    mysql> drop table ftpuser;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> CREATE TABLE `ftpuser` (
        ->   `id` int(3) NOT NULL auto_increment,
        ->   `username` varchar(60) character set latin1 collate latin1_bin default NULL,
        ->   `uid` int(11) default NULL,
        ->   `gid` int(11) default NULL,
        ->   `password` varchar(30) default NULL,
        ->   `homedir` varchar(250) default NULL,
        ->   PRIMARY KEY  (`id`)
        -> ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> LOAD DATA LOCAL INFILE '/root/ftpuser.csv' INTO TABLE ftpuser FIELDS TERMINATED BY ';';
    Query OK, 3 rows affected, 3 warnings (0.00 sec)
    Records: 3  Deleted: 0  Skipped: 0  Warnings: 0
    
    mysql> select * from ftpuser;
    +----+----------+-------+-------+----------+-----------+
    | id | username | uid   | gid   | password | homedir   |
    +----+----------+-------+-------+----------+-----------+
    |  1 | user1    | 10001 | 10011 | password | /home/ftp | 
    |  2 | user2    | 10002 | 10022 | password | /home/ftp | 
    |  3 | user3    | 10003 | 10033 | password | /home/ftp | 
    +----+----------+-------+-------+----------+-----------+
    3 rows in set (0.00 sec)
    
    mysql> LOAD DATA LOCAL INFILE '/root/ftpuser.csv' REPLACE INTO TABLE ftpuser FIELDS TERMINATED BY ';';Query OK, 3 rows affected, 3 warnings (0.00 sec)
    Records: 3  Deleted: 0  Skipped: 0  Warnings: 0
    
    mysql> select * from ftpuser;
    +----+----------+-------+-------+----------+-----------+
    | id | username | uid   | gid   | password | homedir   |
    +----+----------+-------+-------+----------+-----------+
    |  1 | user1    | 10001 | 10011 | password | /home/ftp | 
    |  2 | user2    | 10002 | 10022 | password | /home/ftp | 
    |  3 | user3    | 10003 | 10033 | password | /home/ftp | 
    |  4 | user1    | 10001 | 10011 | password | /home/ftp | 
    |  5 | user2    | 10002 | 10022 | password | /home/ftp | 
    |  6 | user3    | 10003 | 10033 | password | /home/ftp | 
    +----+----------+-------+-------+----------+-----------+
    6 rows in set (0.00 sec)
    
    Noch eine Idee?
     
  5. #4 sim4000, 09.10.2009
    sim4000

    sim4000 Lebende Foren Legende

    Dabei seit:
    12.04.2006
    Beiträge:
    1.933
    Zustimmungen:
    0
    Ort:
    In meinem Zimmer
    Mach doch einen unique Key über username, uid, gid, und homedir. Dann kann der Eintrag nur einmal in der Konbination in der Tabelle existieren.
    Das musst Du dann im Import abfangen.

    Bei einem INSERT INTO geht das mit ON DUPLICATE KEY. Wie das bei LOAD DATA geht weiß ich leider nicht.
    Alternativ kannst Du auch die Tabelle vorher einfach leeren.
     
  6. #5 flugopa, 09.10.2009
    flugopa

    flugopa Der lernwillige

    Dabei seit:
    27.05.2006
    Beiträge:
    739
    Zustimmungen:
    0
    Ort:
    München
    Hast Du ein Beispiel bzw. ein Webseite mit fehlerfreien Beispiel für mich?

    natürlich könnte ich vorher ein output der tabelle erzeugen und mit bash die beide
    files abgleich und den Rest importieren, aber ich dachte das eine solche funktion
    ein standart ist.
     
  7. #6 sim4000, 09.10.2009
    sim4000

    sim4000 Lebende Foren Legende

    Dabei seit:
    12.04.2006
    Beiträge:
    1.933
    Zustimmungen:
    0
    Ort:
    In meinem Zimmer
    Also ich würde es so machen:
    Code:
    CREATE TABLE IF NOT EXISTS `ftp_user` (
      `username` varchar(255) NOT NULL,
      `uid` int(11) NOT NULL,
      `gid` int(11) NOT NULL,
      `password` varchar(32) NOT NULL,
      `homedir` varchar(255) NOT NULL,
      PRIMARY KEY (`username`),
      UNIQUE KEY `uid` (`uid`),
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    Dabei sind username und uid unabhängig von einander einzigartig. So kann username und uid nur einmal verwendet werden. Alles andere kann ja mehrfach vorkommen.

    Wenn Du nun versuchst, mehrere User mit gleichem Namen / gleicher uid anzulegen, müsste MySQL meckern.
    Den auto_increment Schlüssel kann man sich her Sparen, da man ja den username als natürlichen Schlüssel nehmen kann.
     
  8. #7 flugopa, 09.10.2009
    flugopa

    flugopa Der lernwillige

    Dabei seit:
    27.05.2006
    Beiträge:
    739
    Zustimmungen:
    0
    Ort:
    München
    Hallo sim4000,

    vielen Dank für Deine Hilfe.

    Und so sieht es aus:
    Code:
    mysql> drop table ftp_user;   
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> CREATE TABLE IF NOT EXISTS `ftp_user` (
        ->   `username` varchar(255) NOT NULL,
        ->   `uid` int(11) NOT NULL,
        ->   `gid` int(11) NOT NULL,
        ->   `password` varchar(32) NOT NULL,
        ->   `homedir` varchar(255) NOT NULL,
        ->   PRIMARY KEY (`username`),
        ->   UNIQUE KEY `uid` (`uid`)
        -> ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> LOAD DATA LOCAL INFILE '/root/ftpuser.csv' INTO TABLE ftp_user FIELDS TERMINATED BY ';';
    Query OK, 3 rows affected (0.00 sec)
    Records: 3  Deleted: 0  Skipped: 0  Warnings: 0
    
    mysql> select * from ftp_user;
    +----------+-------+-------+----------+-----------+
    | username | uid   | gid   | password | homedir   |
    +----------+-------+-------+----------+-----------+
    | user1    | 10001 | 10011 | password | /home/ftp | 
    | user2    | 10002 | 10022 | password | /home/ftp | 
    | user3    | 10003 | 10033 | password | /home/ftp | 
    +----------+-------+-------+----------+-----------+
    3 rows in set (0.00 sec)
    
    mysql> LOAD DATA LOCAL INFILE '/root/ftpuser.csv' INTO TABLE ftp_user FIELDS TERMINATED BY ';';
    Query OK, 0 rows affected (0.00 sec)
    Records: 3  Deleted: 0  Skipped: 3  Warnings: 0
    
    mysql> LOAD DATA LOCAL INFILE '/root/ftpuser.csv' INTO TABLE ftp_user FIELDS TERMINATED BY ';';
    Query OK, 0 rows affected (0.00 sec)
    Records: 3  Deleted: 0  Skipped: 3  Warnings: 0
    
    mysql> LOAD DATA LOCAL INFILE '/root/ftpuser.csv' INTO TABLE ftp_user FIELDS TERMINATED BY ';';
    Query OK, 0 rows affected (0.00 sec)
    Records: 3  Deleted: 0  Skipped: 3  Warnings: 0
    
    mysql> select * from ftp_user;
    +----------+-------+-------+----------+-----------+
    | username | uid   | gid   | password | homedir   |
    +----------+-------+-------+----------+-----------+
    | user1    | 10001 | 10011 | password | /home/ftp | 
    | user2    | 10002 | 10022 | password | /home/ftp | 
    | user3    | 10003 | 10033 | password | /home/ftp | 
    +----------+-------+-------+----------+-----------+
    3 rows in set (0.00 sec)
    
    
    Eine Frage hätte ich noch: "Welche Webseiten besucht Du zusätzlich, wenn Du ein MySQL-Problem hast?"
     
  9. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  10. #8 sim4000, 09.10.2009
    sim4000

    sim4000 Lebende Foren Legende

    Dabei seit:
    12.04.2006
    Beiträge:
    1.933
    Zustimmungen:
    0
    Ort:
    In meinem Zimmer
  11. #9 flugopa, 09.10.2009
    flugopa

    flugopa Der lernwillige

    Dabei seit:
    27.05.2006
    Beiträge:
    739
    Zustimmungen:
    0
    Ort:
    München
    So ein Bekannten hätte ich auch gern.:D
    Meine Bekannten arbeiten noch mit Windows ohne SQL.

    Zum Glück gibt es noch Menschen die anderen helfen.
    Danke.
     
Thema:

Doppelte Einträge vermeiden, aber wie?

Die Seite wird geladen...

Doppelte Einträge vermeiden, aber wie? - Ähnliche Themen

  1. Doppelte Einträge im Startmenü

    Doppelte Einträge im Startmenü: Hallo, wie finde ich doppelte Einträge im Startmenü? Ich habe öfters das Problem, dass irgend ein Eintrag im K-Menü zwei Mal existiert. Mit...
  2. uniq - trotzdem doppelte einträge

    uniq - trotzdem doppelte einträge: Hallo zusammen, ich werte ein Maillogfile aus und möchte zu jeder Emailadresse die Anzahl der Einträge haben. Dazu macht ich folgendes: cat...
  3. verhindern doppelter Einträge aus Post Variablen

    verhindern doppelter Einträge aus Post Variablen: Moin. Mein Gästebuch hat ein kleines Problem. Wenn etwas eingetragen hat , man auf aktualisieren klickt dann bekommt man einen weiteren...
  4. Suche in Datei doppelte Wörter in jeder Zeile bis zum dritten Leerzeichen...

    Suche in Datei doppelte Wörter in jeder Zeile bis zum dritten Leerzeichen...: Ich habe eine Textdatei in der ich Einträge bis zum 3. Leerzeichen mit den restlichen Zeilen (auch nur bis 3. Leerzeichen) vergleichen muss und...
  5. Shell Skript zum automatischen Aufräumen von doppelten Ordnern

    Shell Skript zum automatischen Aufräumen von doppelten Ordnern: Hallo, Ich möchte mir ein Shell Script für folgenden Zweck schreiben. Meine Mutter hat auf Ihrem PC und auf verschiedenen Festplatten viele...