Announcement

Collapse
No announcement yet.

Probleme mit insert into / primary key

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

  • Probleme mit insert into / primary key

    hallo,

    ich arbeite seit kurzem an sql. kenne mich also nicht soo gut aus. bitte deswegen um verständnis. also mein problem: ich will personen mit name/vorname in die relation person eintragen mit insert into. nehmen wir an es steht eine person bereits in der tabelle mit den namen max schneider und ich dann eine person mit den namen max müller einfüge, gibt es keine probleme. wenn nicht die vornamen sondern die namen übereinstimmen z.b ich füge anstatt max müller, felix schneider ein, spuckt er ne fehlermeldung
    " ERROR: Cannot insert a duplicate key into unique index person_pkey ".

    ich weiss das es mind. einen p.key in einer relation geben sollte. aber wie kann ich das in diesem fall umgehen?? bitte um hilfe. danke im vorraus

    grüße

  • #2
    Eine Spalte, die prim. Key hat kann nun mal keine "doppelten" Werte aufnehmen. Insofern ist es schlecht, das auf Felder wie Vor- oder Nachnamen anzuwenden. Diese Daten könnten doch tatsächlich mehrfach vorkommen.

    Üblicherweise nimmt man dann dafür eine extra Spalte die man bsp. ID bennennt. Als Datentyp einen Integer und überlässt es der DB einen unique Wert zu bilden -> bsp durch auto-increment oder einer entsprechenden Sequence.
    Christian

    Comment


    • #3
      Hallo,

      das kannst Du "umgehen", in dem Du nur die Datensätze einfügst, die nach dem PK noch nicht in der Zieltabelle vorhanden sind.

      Besteht der PK nur aus einem Feld, ist es sehr leicht:
      [highlight=SQL]
      INSERT INTO ZielTabelle
      (PK, Feld1, Feld2, ...)
      SELECT PK, Feld1, Feld2, ...
      FROM QuellTabelle
      WHERE NOT PK IN
      (SELECT PK
      FROM ZielTabelle)
      [/highlight]

      Wenn es mehrere Feld sind, ist es bloß etwas mehr Tipparbeit:

      [highlight=SQL]
      INSERT INTO ZielTabelle
      (PK1, PK2, ...)
      SELECT Q.PK1, Q.PK2, ...
      FROM QuellTabelle AS Q
      LEFT JOIN ZielTabelle AS Z
      ON Q.PK1 = Z.PK1
      AND Q.PK2 = Z.PK2
      AND ...
      WHERE Z.PK1 IS NULL
      [/highlight]

      Olaf
      Olaf Helper

      <Blog> <Xing>
      * cogito ergo sum * errare humanum est * quote erat demonstrandum *
      Wenn ich denke, ist das ein Fehler und das beweise ich täglich

      Comment


      • #4
        vielen dank für die antworten.

        @olaf: ich hab ja keine quelltabelle wo die namen schon drinstehen. also die namen die ich eintragen will stehen noch nicht in der datenbank.

        danke trotzdem.


        NACHTRAG:

        ich habe jetzt den ganzen tag versucht dieses problem zu lösen, ohne erfolg. hab schon richtig kopfschmerzen

        ich möchte einen neuen eintrag in eine tabelle schreiben, die in der datenbank noch nicht existiert.
        wie oben schon beschrieben, dürfen die vornamen identisch sein, aber nicht die namen.
        sonst bekomm ich ne fehlermeldung: Cannot insert a duplicate key into unique index

        hab schon auf so vielen seiten gelesen, mein kopf ist ziemlich durcheinander

        ich weiss nicht ob ich die definition der relation mit ALTER TABLE ändern und mit constraint not null den eintrag erzwingen kann!? kann man beides miteinander kombinieren?
        oder sollte man lieber den primarykey ändern. das sie quasi nicht auf eine spalte (name) sonder auf 2 spalten (vorname und name) definiert ist!?

        das ist bestimmt echt einfach, aber irgendwie schaffe ich dat net
        kennt jmd bestimmte befehle bzw. kann jmd mir überhaupt helfen??
        Zuletzt editiert von RasenganNarutoo; 23.01.2008, 22:47.

        Comment


        • #5
          ihr seid profis und habt erfahrung im gegensatz zu mir. könnt ihr mir bei meinen kleinen problem helfen?? I NEED HELP

          Comment


          • #6
            Du solltest den primary von den Namen ganz wegnehmen. Es können ja auch mehrere Leute mal den gleichen Vor- und Nachnamen haben.
            Wie das geht, hängt von Deiner Datenbank ab. Wahrscheinlich ist es nur ein Mausclick.
            Dann kannst Du mit
            alter table Tabelle add pers_id integer
            ein Feld für den primary key definieren.
            Danach musst Du dieses Feld für die bereits vorhandenen Sätze durchnummerieren.
            Dann definiere es um als Autowert, der sich selbständig hochzählt und als primary key.
            (Wahrscheinlich auch nur ein bis zwei Mausclicks.)

            Gruß frauwue
            Zuletzt editiert von frauwue; 24.01.2008, 00:32. Reason: Mein Text war verschwunden, deshalb habe ich jetzt in Etappen geschrieben
            docendo discimus

            Comment


            • #7
              hhm....dann müsste ich bei den anderen bereits vorhandenen relationen auch id's extra einfügen, oder?? ich check das mal aus. danke

              Comment


              • #8
                Was genau machst Du überhaupt, also wie trägst Du die Namen überhaupt ein?
                Über eine Applikation (Frontend) oder führst Du direkt INSERT-Befehle gegen die Datenbank aus?

                Olaf
                Olaf Helper

                <Blog> <Xing>
                * cogito ergo sum * errare humanum est * quote erat demonstrandum *
                Wenn ich denke, ist das ein Fehler und das beweise ich täglich

                Comment


                • #9
                  ich hab das mit der insert into anweisung gemacht.

                  also: INSERT INTO person (vorname,name) VALUES ('ali','baba')

                  dann kommt halt die fehlermeldung

                  grüße

                  Comment


                  • #10
                    Dann sollte die Meldung eigentlich nicht wirklich stören, da es für Dich nur die Info ist, das der Name bereits vorhanden ist.
                    Also wenn das Feld Name der PK ist (ohne Vorname) kannst Du das mit eine kleinem Script umgehen.
                    Wie das aussieht hängt von der verwendeten DBMS ab, müsstest Du also noch ggf. anpassen. Unter MS SQL Server könnte man es so machen:
                    [highlight=SQL]
                    DECLARE @Vorname as varchar(100)
                    DECLARE @Name as varchar(100)

                    SET @Vorname = 'ali'
                    SET @Name = 'baba'

                    IF EXISTS (SELECT Name FROM Person WHERE Name = @Name)
                    PRINT 'Der Name ist bereits vorhanden!'
                    ELSE
                    INSERT INTO person (vorname,name) VALUES (@Vorname, @Name)
                    [/highlight]

                    Falls doch noch Vorname Teil des PKs ist, muss Du es im EXISTS(SELECT Teil noch ergänzen.

                    Olaf
                    Olaf Helper

                    <Blog> <Xing>
                    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
                    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

                    Comment


                    • #11
                      @Olaf,

                      vielleicht solltest Du Dir den Thread nochmal von vorne durchlesen.
                      Wieso sollen in einer Datenbank Namen nicht doppelt vorkommen können?
                      Es hängt immer davon ab, ob diesselbe Person damit gemeint ist, und was es noch für zusätzliche Daten zu dieser Person gibt.
                      docendo discimus

                      Comment


                      • #12
                        danke für eure hilfen

                        Comment

                        Working...
                        X