Doppelte Einträge vermeiden, aber wie?

F

flugopa

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
 
versuchs mal mit
load data infile 'filename' replace
bye,
yai
 
versuchs mal mit
load data infile 'filename' replace
bye,
yai

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?
 
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.
 
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.
Hast Du ein Beispiel bzw. ein Webseite mit fehlerfreien Beispiel für mich?

Alternativ kannst Du auch die Tabelle vorher einfach leeren.
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.
 
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.
 
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?"
 

Ähnliche Themen

JBidWatcher: Problem bei loading Auctions in Verbindung mit mySQL

Debian squeeze, Webmin, Samba Freigaben

CentOS 6.3 RADIUS - Keine Verbindung möglich

dovecot und postfix Konfiguration Problem

Mit Bash-Skript einen Datensatz auslesen?

Zurück
Oben