tutorials.de Buch-Aktion 05/2012
Like Tree3Danke
  • 1 Beitrag von CPoly
  • 2 Beitrag von CPoly
ERLEDIGT
JA
ANTWORTEN
10
ZUGRIFFE
600
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    gine78 gine78 ist offline Rookie
    Registriert seit
    Sep 2011
    Ort
    Berlin, Germany, Germany
    Beiträge
    5
    Hallo Toutorial.de,

    so... nun habe ich mich auch mal angemeldet, ich verzweifle langsam...

    Meine Situation:
    Ich bekomme eine CSV Datei welche ich im Anschluß in eine mysql datenbank importiere, die Tabelle sieht dann so aus:
    Tabelle1
    Code :
    1
    
    |name|datum|art
    diese ist gefüllt mit einem Monat Dienstplan, jedoch nur bezogen auf diese drei Einträge.

    Nun habe ich eine zweite Tabelle in welche die Daten kopiert werden sollen, soweit kein Problem... bis zu dem Zeitpunkt wo schon Daten zu dem Namen und dem Datum in dieser Tabelle stehen. Ich kann in dieser Tabelle keine doppelten Einträge gebrauchen, da mir doppelte Einträge den kompletten Dienstplan zerkloppen.

    Lange Rede kurzer Sinn:

    Ich suche eine Möglichkeit die Tabelle1 in Tabelle2 zu kopieren, jedoch inclusiv der Überprüfung ob schon ein Datensatz zu dem Namen und dem Datum existiert, wenn schon einer existiert soll dieser nicht in die Tabelle2 kopiert werden.

    Ich will das ganze gern direkt in mysql ausführen, ohne php... würde aber im Notfall auch php nutzen.

    Hat jemand einen klitzekleinen Ansatz für mich?

    Vielen lieben Dank,
    Carsten
     

  2. #2
    SE Tutorials.de Gastzugang
    Einfach die entsprechenden Spalten UNIQUE oder PRIMARY_KEY makieren ... dann macht den Rest die DB selbst.
     

  3. #3
    gine78 gine78 ist offline Rookie
    Registriert seit
    Sep 2011
    Ort
    Berlin, Germany, Germany
    Beiträge
    5
    Hallo,

    ja würde gehen... wenn... das ganze nicht so doof wäre wie es ist.

    Ich habe in der Tabelle leider zum Datum mehrere einträge:

    Z.B.:

    |name|datum|art
    |wxyz|2011-11-11|event
    |abcd|2011-11-11|event
    |lmno|2011-11-11|fbp
    usw...

    Ich kann also auf keine Spalte einen UNIQUE setzen.
     

  4. #4
    SE Tutorials.de Gastzugang
    Hmm ... ok .. das klingt einleuchtend. Sorry ... ich dachte du arbeitest mit dierektem Timestamp oder sowas.
    Ob es jetzt aber etwas gibt das einen kompletten Datensatz prüft ? Ja gut ... ich könnt mir denken das das mit so nem kranken Query über 5 Ecken geht ... aber so bewandert bin ich dann doch leider nicht auf dem Gebiet das ich dir sowas zusammenbauen könnte.
     

  5. #5
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Ein Index kann beliebig viele Spalten umfassen. Also auch die Kombination aus Datum und Name.
    SE bedankt sich. 

  6. #6
    SE Tutorials.de Gastzugang
    @CPloy
    Manache Leute sind einfach nur genial. Daran habe ich überhaupt nicht gedacht das du ja den Index über mehrere Spalten strecken kannst.

    *boar man bin ich doof*
     

  7. #7
    gine78 gine78 ist offline Rookie
    Registriert seit
    Sep 2011
    Ort
    Berlin, Germany, Germany
    Beiträge
    5
    Ok,
    Das klingt logisch, habe aber damit noch nicht gearbeitet.

    D.h. Ich setze einen Index auf Name u. Datum, das löst mein Problem?
    Ich setze den Index logischerweise auf die zieltabelle, kopiere meine quelltabelle rüber... MySQL ignoriert dann alle "Rows" welche die gleichen Werte haben wie die auf denen ich den Index gesetzt habe?

    Also in meinem Beispiel wäre der Index auf dem namen und dem Datum. Da zu jedem Datum höchstens nur ein Datensatz existieren darf. Habe ich das soweit richtig verstanden?

    Vielen lieben Dank!
     

  8. #8
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Zitat Zitat von SPiKEe Beitrag anzeigen
    @CPloy
    Manache Leute sind einfach nur genial. Daran habe ich überhaupt nicht gedacht das du ja den Index über mehrere Spalten strecken kannst.

    *boar man bin ich doof*
    Übertreib mal nicht, jeder steht mal auf dem Schlauch

    Zitat Zitat von gine78 Beitrag anzeigen
    Ok,
    D.h. Ich setze einen Index auf Name u. Datum, das löst mein Problem?
    Ich setze den Index logischerweise auf die zieltabelle, kopiere meine quelltabelle rüber... MySQL ignoriert dann alle "Rows" welche die gleichen Werte haben wie die auf denen ich den Index gesetzt habe?

    Also in meinem Beispiel wäre der Index auf dem namen und dem Datum. Da zu jedem Datum höchstens nur ein Datensatz existieren darf. Habe ich das soweit richtig verstanden?
    Ja, das stimmt so weit. Du musst aber noch etwas beachten: MySQL wirft eine Fehlermeldung, sobald du einen doppelten Datensatz einfügen willst. Das kannst du aber verhindern.

    Aber von vorne:

    Code sql:
    1
    2
    3
    4
    5
    
    CREATE TABLE test (a INT, b INT);
     
    CREATE UNIQUE INDEX `mein_index` ON test (a,b);
     
    INSERT INTO test VALUES (1,1), (1,2), (1,3);

    Jetzt haben wir unsere Testtabelle, bei der die Kombination aus a und b eindeutig sein muss. Versuchen wir mal einen doppelten Datensatz UND einen neue einzufügen.


    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    INSERT INTO test VALUES (1,1), (1,4);
     
    ERROR 1062 (23000): Duplicate entry '1-1' FOR KEY 'mein_index'
     
    SELECT * FROM test;
    +------+------+
    | a    | b    |
    +------+------+
    |    1 |    1 |
    |    1 |    2 |
    |    1 |    3 |
    +------+------+
    3 ROWS IN SET (0.00 sec)

    Keine der beiden wurde eingefügt!

    Das kannst du aber explizit ändern (beachte das IGNORE schlüsselwort).

    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    INSERT IGNORE INTO test VALUES (1,1), (1,4);
     
    SELECT * FROM test;
    +------+------+
    | a    | b    |
    +------+------+
    |    1 |    1 |
    |    1 |    2 |
    |    1 |    3 |
    |    1 |    4 |
    +------+------+
    4 ROWS IN SET (0.00 sec)

    Neben IGNORE kannst du auch noch was anderes machen.

    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    ALTER TABLE test ADD c INT NOT NULL DEFAULT 0;
     
    SELECT * FROM test;
    +------+------+---+
    | a    | b    | c |
    +------+------+---+
    |    1 |    1 | 0 |
    |    1 |    2 | 0 |
    |    1 |    3 | 0 |
    |    1 |    4 | 0 |
    +------+------+---+
    4 ROWS IN SET (0.00 sec)
     
    INSERT INTO test (a,b) VALUES (1,1) ON duplicate KEY UPDATE c=c+1;
     
    SELECT * FROM test;
    +------+------+---+
    | a    | b    | c |
    +------+------+---+
    |    1 |    1 | 1 |
    |    1 |    2 | 0 |
    |    1 |    3 | 0 |
    |    1 |    4 | 0 |
    +------+------+---+
    4 ROWS IN SET (0.00 sec)


    In dem Fall benutzen wir ON DUPLICATE KEY UPDATE, um zu zählen, wie oft versucht wurde, ein doppelten Key einzufügen. Du könntest damit auch z.B. ein timestamp updaten oder ähnliches.


    Edit: In deinem Fall also:

    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    CREATE TABLE test2 (a INT, b INT);
     
    INSERT INTO test2 VALUES (1,1), (1,2), (5,6);
     
    INSERT IGNORE INTO test (a,b) SELECT a,b FROM test2;
     
    SELECT * FROM test;
    +------+------+---+
    | a    | b    | c |
    +------+------+---+
    |    1 |    1 | 1 |
    |    1 |    2 | 0 |
    |    1 |    3 | 0 |
    |    1 |    4 | 0 |
    |    5 |    6 | 0 |
    +------+------+---+
    5 ROWS IN SET (0.00 sec)
    Geändert von CPoly (16.09.11 um 09:42 Uhr)
    Daywood und gine78 bedanken sich. 

  9. #9
    gine78 gine78 ist offline Rookie
    Registriert seit
    Sep 2011
    Ort
    Berlin, Germany, Germany
    Beiträge
    5
    CPoly,

    ich bin ehrlich gesagt ziemlich sprachlos! Ich benutze das Internet seit 1998, ich hab schon viele Foren gesehen bzw. erlebt... aber so eine TOP! Antwort auf eine Frage habe ich noch NIE bekommen. Herzlichen Dank******


    Was mir hierbei ja besonders gefällt ist "ON DUPLICATE KEY UPDATE" - So kann ich auslesen welche datensätze nicht geschrieben wurden und diese nachträglich anzeigen lassen.

    ICH werde berichten!

    VIELEN DANK noch einmal******
     

  10. #10
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Freut mich, dass ich helfen konnte. Ich schreib auch nicht immer so ausführliche Antworten, aber ich hatte gerade Lust das ganze schnell mal durch zuspielen.
     

  11. #11
    gine78 gine78 ist offline Rookie
    Registriert seit
    Sep 2011
    Ort
    Berlin, Germany, Germany
    Beiträge
    5
    Danke hat nun auch produktiv super geklappt, vielen Dank******
     

Ähnliche Themen

  1. Tabelle kopieren (aber Updated)
    Von Every_b im Forum PHP
    Antworten: 4
    Letzter Beitrag: 11.09.07, 12:09
  2. Antworten: 1
    Letzter Beitrag: 05.05.07, 19:44
  3. Antworten: 4
    Letzter Beitrag: 09.05.06, 15:24
  4. Bestimmte Einträge aus einer Tabelle in eine andere Tabelle kopieren
    Von medico im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 29.03.06, 18:42
  5. Antworten: 1
    Letzter Beitrag: 29.03.06, 17:48

Stichworte