Announcement

Collapse
No announcement yet.

Keine doppelten Datensätze einfügen

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

  • Keine doppelten Datensätze einfügen

    Hallo,

    ich möchte bestimmte Datensätze aus einer Tabelle(artikel) in eine andere Tabelle(translation), die später für die Volltextsuche dienen soll, einfügen. Dabei soll aber geprüft werden, ob der Datensatz schon vorhanden ist. Zusätzlich ist noch zu sagen, die neue Tabelle wird immer wieder aktualierst werden und die alte beinhaltet ein paar Hunderttausend/Millionen Datensätze (so genau kann ich das net sagen), deshalb sind Lösungsvorschläge wie "nachdem Einfügen doppelte löschen oder von der einen Tabelle in wieder eine neue Tabelle verschieben und doppelte filtern" für mich schwachsinnig und können weggelassen werden.

    Ich hatte ma was von UNIQUE gelesen, aber auch nur in Verbindung mit Integer. Nur die Spalte, die nicht doppelt sein darf, ist ein Text (bestehend aus mehreren Wörtern).
    Und REPLACE hatte ich mal versucht, aber das haute dann auch net wirklich hin...


    Ein kleiner Auszug aus dem Programm

    PHP Code:
        rs st.executeQuery("Select a.ArtikelNr, a.Kurztext, b.Kurztext from artikel a, artikelfremdsprachen " +
                  
    "b where a.ArtikelID=b.ArtikelID and b.SprachenID=2");
        
        
    Statement st1 con.createStatement(); 
        while(
    rs.next()){
            
    st1.executeUpdate("insert into translation  (Deutsch, Quelle, QuelleNummer, Englisch) " +
                    
    "values ('"+rs.getString("a.Kurztext")+"', '1', '"+rs.getString("a.ArtikelNr")+"'," +
                       
    " '"+rs.getString("b.Kurztext")+"') ");
        } 


    Also beim ersten Durchlauf des Programms sind die Daten in der Tabelle ja korrekt, nur wenn ich dann weitere mache, fügt es ja immer die selben wieder ein.

    Hoffe, jemand kann mir helfen <.<


    Ähm ja.. vllt noch erwähnenswert, ich arbeite mit MySQL 5.0

    EDIT: Mir is noch was eingefallen, nur weiß ich nicht wirklich, wie ich es realisieren soll:
    PHP Code:
    select ID from translation where Deutsch rs.getString("a.Kurztext")
                      if 
    ID 0 dann vorhandend.hnicht mehr in translation einfügen 
    Zuletzt editiert von mysql@java; 27.08.2009, 09:38.

  • #2
    Unique geht für alles

    Hallo mysql@java,

    den unique constraint kann man auch auf andere Datentypen anwenden als int. Varchar geht auf jeden Fall. Man kann den constraint sogar über mehrere Spalten erstrecken, wenn es sein muss. Zur Einrichtung des Constraints folgende Seite von der MySql-Doku:
    http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

    Gruß ngomo
    http://www.winfonet.eu

    Comment


    • #3
      PHP Code:
          DROP TABLE IF EXISTS TRANSLATION;
          
      create table TRANSLATION
          
      (
             
      ID INT UNSIGNED NOT NULL AUTO_INCREMENT,     
             
      Quelle    SMALLINT UNSIGNED DEFAULT 0 COMMENT '1=Artikel,2=Beleg',
             
      QuelleNummer CHAR(25)  DEFAULT '' COMMENT 'wenn Quelle=1 steht hier Artikelnr, wenn 2 dann die  Belegnr'  ,
             
      Deutsch text,
             
      Englisch text,
          
      PRIMARY KEY (ID)
          )
          
      TYPE MYISAM
          

      Hm... ich versteh die Doku von der MySQL Seite nicht wirklich.. das beschriebene is für mich als kompletter Neuling, der MySQL mal eben in 2 Tagen nur mit Hilfe eines Buches gelernt hat, vllt doch etwas viel auf einmal...

      Könntest du vllt den Quellcode so verändern, dass Deutsch auf UNIQUE gesetzt ist?

      Comment


      • #4
        Erwischt

        Ja, da hast Du genau einen Datentyp erwischt, bei dem es mit Unique nicht so leicht ist. Beim Datentyp Text kann MySql keinen Index auf den kompletten Inhalt machen, sondern nur auf die ersten n Zeichen. Das n musst Du angeben. Code wie folgt:
        PHP Code:
        DROP TABLE IF EXISTS TRANSLATION
            
        create table TRANSLATION 
            

               
        ID INT UNSIGNED NOT NULL AUTO_INCREMENT,      
               
        Quelle    SMALLINT UNSIGNED DEFAULT 0 COMMENT '1=Artikel,2=Beleg'
               
        QuelleNummer CHAR(25)  DEFAULT '' COMMENT 'wenn Quelle=1 steht hier Artikelnr, wenn 2 dann die  Belegnr'  
               
        Deutsch text
               
        Englisch text
            
        PRIMARY KEY (ID),
            
        UNIQUE(Deutsch(1000)) 
            ) 
            
        TYPE MYISAM 
            

        Hier werden die ersten 1000 Zeichen für einen Vergleich herangezogen. Damit verhinderst Du, dass ein deutscher Text doppelt eingetragen wird. Wenn der Text sich allerdings erst im 1001. Zeichen unterscheidet, würde MySQL das als Constraintverletzung ansehen. Musst Du überlegen, wie groß Du die Zahl machen willst.

        Noch eine Anmerkung MYISAM beachtet keine Foreign Key Constraints. Wenn Du die haben möchtest, musst Du auf eine andere Engine wechseln, z.B. INNODB.

        Gruß ngomo
        http://www.winfonet.eu

        Comment

        Working...
        X