IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

delete sur plusieurs tables


Sujet :

Oracle

  1. #1
    Membre actif
    Inscrit en
    Juin 2003
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 270
    Points : 216
    Points
    216
    Par défaut delete sur plusieurs tables
    Bonjour,

    comment supprimer des lignes de plusieurs tables à la fois ?

    la syntaxe suivante qui me paraissait logique ne passe pas sous Oracle (ORA-00933: La commande SQL ne se termine pas correctement)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    delete from table1 T1, table2 T2, table3 T3
    where (T1.id <>1000) and (T1.ID = T2.ID) and (T1.ID = T3.ID)
    Merci

  2. #2
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    cela ne fonctionne pas, il faut faire 3 delete.

  3. #3
    Membre actif
    Inscrit en
    Juin 2003
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    Ok, j'imagine que c'est pour des raisons de sécurité.

    Dans mon cas, il faudra plutôt faire une procédure stockée car il y un lien entre les 3 tables.

    Merci

  4. #4
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    en fait c'est possible d'effacer des lignes de plusieurs tables dans certaines circonstances, mais je le déconseille car on ne voit pas trop ce qui se passe...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    delete from 
    (select * from table1 T1, table2 T2, table3 T3 
    where (T1.id <>1000) and (T1.ID = T2.ID) and (T1.ID = T3.ID));
    mais ça ne marche que lorsqu'il y a des contraintes d'intégrité référentielle.

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par laurentschneider
    en fait c'est possible d'effacer des lignes de plusieurs tables dans certaines circonstances, mais je le déconseille car on ne voit pas trop ce qui se passe...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    delete from 
    (select * from table1 T1, table2 T2, table3 T3 
    where (T1.id <>1000) and (T1.ID = T2.ID) and (T1.ID = T3.ID));
    mais ça ne marche que lorsqu'il y a des contraintes d'intégrité référentielle.
    Votre proposition est-elle valable en 8i car j'obtiens l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    delete from (
                *
    ERROR à la ligne 1 :
    ORA-01752: cannot delete from view without exactly one key-preserved table
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  6. #6
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Citation Envoyé par drinkmilk
    Ok, j'imagine que c'est pour des raisons de sécurité.

    Dans mon cas, il faudra plutôt faire une procédure stockée car il y un lien entre les 3 tables.

    Merci
    Dans ce cas, s'il y a un lien, pourquoi ne pas avoir la clause ON DELETE CASCADE sur la foreign key ?

  7. #7
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par Magnus
    Citation Envoyé par laurentschneider
    en fait c'est possible d'effacer des lignes de plusieurs tables dans certaines circonstances, mais je le déconseille car on ne voit pas trop ce qui se passe...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    delete from 
    (select * from table1 T1, table2 T2, table3 T3 
    where (T1.id <>1000) and (T1.ID = T2.ID) and (T1.ID = T3.ID));
    mais ça ne marche que lorsqu'il y a des contraintes d'intégrité référentielle.
    Votre proposition est-elle valable en 8i car j'obtiens l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    delete from (
                *
    ERROR à la ligne 1 :
    ORA-01752: cannot delete from view without exactly one key-preserved table
    en 8i c'est possible, mais je pense que ton modèle de données n'est pas ok.

    avec emp et dept, ca marche bien

    on a

    EMP(DEPTNO) references DEPT(DEPTNO)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SQL> delete (select * from emp,dept where emp.deptno=dept.deptno);
    14 rows deleted.
    mon conseil est de suivre la première réponse de Leo et d'effectuer 3 delete.

  8. #8
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    note que le résultat n'est pas forcément celui escompté :-(

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SQL> select (select count(*) from emp), (select count(*) from dept) from dual;                                                                                                  
    (SELECTCOUNT(*)FROMEMP) (SELECTCOUNT(*)FROMDEPT)
    ----------------------- ------------------------
                         14                        4
     
    SQL> delete (select * from emp,dept where emp.deptno=dept.deptno);                                                                                                              
     
    14 rows deleted.
     
    SQL> select (select count(*) from emp), (select count(*) from dept) from dual;                                                                                                  
    (SELECTCOUNT(*)FROMEMP) (SELECTCOUNT(*)FROMDEPT)
    ----------------------- ------------------------
                          0                        4
    rien n'a été effacé dans dept.

    faire 3 delete me parait vraiment plus approprié

  9. #9
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Citation Envoyé par laurentschneider
    rien n'a été effacé dans dept.

    faire 3 delete me parait vraiment plus approprié
    le plus clean étant quand même d'avoir des FK et du DELETE CASCADE... ;-)

    on est sûr de n'oublier aucune table et on n'a qu'une seule instruction...

  10. #10
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par laurentschneider
    note que le résultat n'est pas forcément celui escompté :-(

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SQL> select (select count(*) from emp), (select count(*) from dept) from dual;                                                                                                  
    (SELECTCOUNT(*)FROMEMP) (SELECTCOUNT(*)FROMDEPT)
    ----------------------- ------------------------
                         14                        4
     
    SQL> delete (select * from emp,dept where emp.deptno=dept.deptno);                                                                                                              
     
    14 rows deleted.
     
    SQL> select (select count(*) from emp), (select count(*) from dept) from dual;                                                                                                  
    (SELECTCOUNT(*)FROMEMP) (SELECTCOUNT(*)FROMDEPT)
    ----------------------- ------------------------
                          0                        4
    rien n'a été effacé dans dept.

    faire 3 delete me parait vraiment plus approprié
    En 10GR1 ça fonctionne mais comme vous le montrez cette instruction supprime apparemment (?) uniquement les données de la table contenant la foreign key.

    Pour info, en 8i j'ai bien respecté les contraintes de primary / foreign key mais franchement j'ai du mal à comprendre l'intérêt d'une telle syntaxe surtout quand on voit ce qu'elle donne à l'exécution...
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  11. #11
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par Magnus
    mais franchement j'ai du mal à comprendre l'intérêt d'une telle syntaxe surtout quand on voit ce qu'elle donne à l'exécution...
    l'interêt est plus évident lorsque tu employes des vues, par exemple GUGUS peut lire et effacer emp, mais pas voir les salaires

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    SQL> create or replace view scott.smallemp as select empno, ename, dname, job from scott.emp,scott.dept where emp.deptno=dept.deptno;
     
    View created.
     
    SQL> grant select,insert,update,delete on scott.smallemp to gugus;
     
    Grant succeeded.
     
    SQL> connect gugus/gugus
    Connected.
     
    SQL> select * from scott.smallemp where ename='SCOTT';
         EMPNO ENAME      DNAME          JOB
    ---------- ---------- -------------- ---------
          7788 SCOTT      RESEARCH       ANALYST
     
     
    SQL> delete from scott.smallemp where ename='SCOTT';
     
    1 row deleted.
    Tout de bon
    Laurent

  12. #12
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par LeoAnderson
    le plus clean étant quand même d'avoir des FK et du DELETE CASCADE... ;-)
    c'est bien sûr une question de goût, ce qui me dérange dans le delete cascade, c'est qu'on ne se rend pas compte de ce qu'on efface

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
     
    SQL> create table t1(x number primary key, text varchar2(40));
     
    Table created.
     
    SQL> create table t2(y number primary key,x number references t1(x) on delete cascade, text varchar2(40));
     
    Table created.
     
    SQL> insert into t1 values (1,'jambon');
     
    1 row created.
     
    SQL> insert into t2 values (1,1,'fromage');
     
    1 row created.
     
    SQL> insert into t2 values (2,1,'moutarde');
     
    1 row created.
     
    SQL> delete t1;
     
    1 row deleted.
    en fait, "1 row deleted" est troublant, car en fait, on a effacé 3 lignes, mais c'est sûrement une question d'habitude

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème delete sur plusieurs tables
    Par soubre dans le forum Hibernate
    Réponses: 4
    Dernier message: 19/06/2008, 17h16
  2. DELETE sur plusieurs tables
    Par kazuo0 dans le forum Requêtes
    Réponses: 5
    Dernier message: 21/12/2007, 18h24
  3. Delete sur plusieurs tables
    Par Megoy dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/05/2007, 10h41
  4. Delete sur plusieurs tables
    Par estelledany dans le forum Langage SQL
    Réponses: 5
    Dernier message: 24/07/2006, 11h16
  5. [MSDE] Delete sur plusieurs tables ?
    Par hardballer dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/05/2006, 10h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo