Announcement

Collapse
No announcement yet.

Ganze Tabelle löschen durch Löschen einer Zeile

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

  • Ganze Tabelle löschen durch Löschen einer Zeile

    Guten Tag,

    Ich möchte versuchen durch Löschen einer Zeile den gesamten Inhalt zweier Tabellen zu löschen. Bei den INSERTS muss das entsprechende eingegeben werden. Ganz unten ist der Delete-Befehl. Kann mir da jemand ein Beispiel geben ?


    Code:
    CREATE TABLE Z1 ( K1 CHAR(2), K2 CHAR(2), PRIMARY KEY (K1));
    
    CREATE TABLE Z2 ( K2 CHAR(2), K1 CHAR(2), PRIMARY KEY (K2));
    
    INSERT INTO Z1
    VALUES ('1',
            '6');
            
    INSERT INTO Z1
    VALUES ('2',
            '5');
            
    INSERT INTO Z1
    VALUES ('3',
            '4');
            
    INSERT INTO Z1
    VALUES ('4',
            '3');
            
    INSERT INTO Z1
    VALUES ('5',
            '2');
            
    INSERT INTO Z1
    VALUES ('6',
            '1');
            
    INSERT INTO Z2
    VALUES ('6',
            '1');
            
    INSERT INTO Z2
    VALUES ('5',
            '2');
            
    INSERT INTO Z2
    VALUES ('4',
            '3');
            
    INSERT INTO Z2
    VALUES ('3',
            '4');
            
    INSERT INTO Z2
    VALUES ('2',
            '5');
            
    INSERT INTO Z2
    VALUES ('1',
            '6');
    
    ALTER TABLE Z1 ADD CONSTRAINT fk1
    FOREIGN KEY (K2) REFERENCES Z2(K2) ON
    DELETE CASCADE;
    
    ALTER TABLE Z2 ADD CONSTRAINT fk2
    FOREIGN KEY (K1) REFERENCES Z1(K1) ON
    DELETE CASCADE;
    
    DELETE
    FROM Z1
    WHERE K1 = '1';
    Zuletzt editiert von eagle-zero; 30.01.2013, 12:15.

  • #2
    Ist das die Anforderung aus einer Programmierer Wette oder Ernst oder kennst Du die Möglichkeiten des Delete Befehls nicht?

    Originally posted by eagle-zero View Post
    Bei den INSERTS muss das entsprechende eingegeben werden.
    Das ist leider in Deinem Beispiel nicht der Fall.
    Gruß, defo

    Comment


    • #3
      Hallo,
      bei der Definition von Z1.K1 als CHAR(2), löscht ein
      [highlight=sql]
      DELETE
      FROM Z1
      WHERE K1 = '1'
      [/highlight]
      Sicherlich einfach gar nichts, da alle eingefügten Werte zu einem CHAR(2) erweitert werden.
      Also eher so:
      [highlight=sql]
      DELETE
      FROM Z1
      WHERE K1 = '1 '
      [/highlight]

      Gruß Falk
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment


      • #4
        @Falk
        Unter Oracle funktioniert das.


        Problem ist aber, dass die Referenzen nicht kaskadieren.
        Gruß, defo

        Comment


        • #5
          Also das Problem ist real. Ich möchte zeigen, dass es möglich ist (mit den Oracle SQL Developer) den kompletten Inhalt zweier Tabellen mit dem Löschen einer Zeile zu realisieren.

          Der Befehl ist vorgegeben
          Code:
          DELETE
          FROM Z1
          WHERE K1 = '1';
          Soweit ich weiß muss es möglich sein. Es müssen nur entsprechende INSERTS eingefügt werden.
          Ich behandle gerade in meiner Gruppe die Referentielle Integrität und das beinhaltet auch die DELETE Befehle.
          Bloß wenn man mit der Cascadierung nicht aufpasst, dann kann es passieren, dass man die Tabellen aus versehen
          komplett löscht, da sich das dann immer weiter fortsetzt bis nichts mehr übrig ist.

          edit: Ich meine den Tabelleninhalt. Nicht die Tabelle komplett.
          Zuletzt editiert von eagle-zero; 30.01.2013, 17:22.

          Comment


          • #6
            Ok, wie geschrieben, wenn Du das zeigen möchtest, müssen die Daten auch entsprechend eingegeben sein- wie Du ja auch selber anmerkst. Das ist bei Deinem Beispiel aber nicht der Fall. Es sind immer nur Päärchen.
            Gruß, defo

            Comment


            • #7
              Ja genau. Das sind von mir nur Beispielwerte. Diese Werte müssen jetzt so angepasst werden, dass alles beim Löschen-Befehl am Ende aus den Tabellen entfernt wird

              Comment


              • #8
                Ich sehe noch ein anderes Problem: Wenn die Tabelle einmal leer ist kann man nichts mehr einfügen, es sei denn K1 = K2. Was willst du damit bezwecken?

                Möchtest du wirklich die ganze Tabelle löschen oder darf eine Zeile (das Root Objekt) drin bleiben?
                Solch eine Tabelle zu definieren wäre kein Problem.

                Gruss
                Zuletzt editiert von Wernfried; 30.01.2013, 18:28. Reason: besseres Deutsch

                Comment


                • #9
                  Naja, das ist aber schon ziemlich konstruiert.
                  Du erzeugst ja die Constraints erst, nachdem die Daten eingetragen wurden. In einem derartigen Datenmodel, das diese Constraints bereits definiert hat, bekäme ein Anwender die Daten ja gar nicht rein. Da bräuchte man schon deferrable constraints.

                  Mit passenden Daten sähe es dann ungefähr so aus:
                  [HIGHLIGHT=SQL]
                  SQL> select * from z1;

                  K1 K2
                  --------------------------------------- ---------------------------------------

                  SQL> select * from z2;

                  K2 K1
                  --------------------------------------- ---------------------------------------

                  SQL>
                  SQL> insert into z1 (K1, K2)
                  2 values (1, 1);

                  1 row inserted
                  SQL> insert into z1 (K1, K2)
                  2 values (2, 2);

                  1 row inserted
                  SQL> insert into z1 (K1, K2)
                  2 values (3, 3);

                  1 row inserted
                  SQL> insert into z2 (K2, K1)
                  2 values (1, 2);

                  1 row inserted
                  SQL> insert into z2 (K2, K1)
                  2 values (2, 3);

                  1 row inserted
                  SQL> insert into z2 (K2, K1)
                  2 values (3, 1);

                  1 row inserted

                  SQL> commit;

                  Commit complete

                  SQL> select * from z1;

                  K1 K2
                  --------------------------------------- ---------------------------------------
                  1 1
                  2 2
                  3 3

                  SQL> select * from z2;

                  K2 K1
                  --------------------------------------- ---------------------------------------
                  1 2
                  2 3
                  3 1

                  SQL>
                  SQL> delete from z1 where k1 =1
                  2 ;

                  1 row deleted
                  SQL>-- Nur eine Zeile gelöscht! Aber ..

                  SQL> select * from z1;

                  K1 K2
                  --------------------------------------- ---------------------------------------

                  SQL> select * from z2;

                  K2 K1
                  --------------------------------------- ---------------------------------------

                  SQL>
                  [/HIGHLIGHT]
                  Gruß, defo

                  Comment


                  • #10
                    Ich möchte zeigen dass es möglich ist dass beim Löschen einer Zeile auch damit gleichzeitig alles gelöscht wird. Auch Tabellenübergreifend. Du sprichst davon, dass das mit dem verbleibenden root objekt möglich ist. kannst du die obige tabelle so anpassen ? es dürfen aber nur die inserts eingefügt und verändert werden.

                    edit: oh da warste scho schneller als ich

                    Comment


                    • #11
                      Originally posted by eagle-zero View Post
                      Ich möchte zeigen dass es möglich ist dass beim Löschen einer Zeile auch damit gleichzeitig alles gelöscht wird. kannst du die obige tabelle so anpassen ? es dürfen aber nur die inserts eingefügt und verändert werden.
                      Willst Du Deinen Lehrer ärgern?
                      Oder bist Du selber einer?
                      6 passende Datensätze "erfinden" ist aber nicht so schwer oder?

                      Also nochmal, ziemlich konstruiert. Spannender sind Konzepte, wie man ein Datemodel aufbaut, um solche und vor allem viel wahrscheinlichere Probleme mit Cascading Constraints zu vermeiden.
                      Gruß, defo

                      Comment


                      • #12
                        Das sieht sehr gut soweit aus. Kannst du mir das noch erklären wie du das gemacht hast ?

                        Edit: Ich bin Student und möchte den Prof. zeigen dass es auch möglich ist dass man seine Tabelle auch löschen kann wenn man nicht aufpasst.

                        Comment


                        • #13
                          Originally posted by eagle-zero View Post
                          Das sieht sehr gut soweit aus. Kannst du mir das noch erklären wie du das gemacht hast ?
                          Also das steht ja da alles. Du brauchst doch nur die inserts in Dein Script oben einzusetzen.
                          Bezüglich der Constraints google mal nach defereable constraints.
                          Die überwachen genauso wie normale constraints, aber "melden" eine Verletzung erst beim Commitzeitpunkt.

                          Originally posted by eagle-zero View Post
                          Edit: Ich bin Student und möchte den Prof. zeigen dass es auch möglich ist dass man seine Tabelle auch löschen kann wenn man nicht aufpasst.
                          Na hoffentlich machst Du Dich nicht unbeliebt. Aber vielleicht gibt's ja auch Schleimpunkt

                          P.S.: Ein ganz irdischer Fall ohne dieses Gebastel mit den Constraints sind Master Detail Beziehungen wie Kunde>Bestellung>Rechnung oder was auch immer. (Versehentlich) Kunde gelöscht, alles weg. Insbesondere die Rechnung mit Rechnungsnummer usw. wird das Finanzamt z.B. interessieren.
                          Gruß, defo

                          Comment


                          • #14
                            aller klar danke nochmal

                            Comment

                            Working...
                            X