2010-03-08 9 views
3

j'ai un schéma comme:mise à jour requête sur plusieurs tables

  • employés (ENO, Ename, zip, hdate)
  • clients (cno, cnmae, rue, zip, téléphone)
  • codes postaux (zip, ville)

où zip est pk dans zipcodes et fk dans d'autres tables.
Je dois écrire une requête de mise à jour qui met à jour toute l'occurence des codes postaux 4994 à 1234 dans toute la base de données.

update zipcodes,customers,employees 
    set zip = 0 
where customers.zip = zipcodes.zip 
    and employees.zip = zipcodes.zip; 

mais je sais que je ne le fais pas correctement. Y at-il un moyen de mettre à jour toutes les tables zip dans une seule requête de mise à jour?

Répondre

1

Je pense, vous devez d'abord insérer une nouvelle ligne pour le nouveau zip dans la table de code postal, mettre à jour le zip dans le reste des tables et enfin supprimer l'ancien code postal.

+0

isnt-il un moyen de le faire simplement via des mises à jour – jon

+0

Vous pouvez le faire de la façon dont vous l'avez indiqué, mais peut-être.? Vous devez verrouiller les tables à partir de l'insertion dans les deux cas: – Kangkan

2

Vous ne pouvez pas mettre à jour plusieurs tables dans une instruction de mise à jour. Vous devrez écrire plusieurs instructions de mise à jour.

NOUVELLE PENSÉE: Vous pourriez ajouter des déclencheurs pour mettre à jour la ligne, de cette façon votre application pourrait mettre à jour 1 table et les déclencheurs propageraient le reste.

+0

SQL> update zipcodes set zip = 1234 où zip = 67226, mise à jour zipcodes * ERROR à la ligne 1: ORA-02292: Contrainte d'intégrité violée - dossier enfant trouvé – jon

+0

J'ai dit la même chose @OMG Ponies et vous avez posté la même réponse –

3

Oracle ne prend pas en charge les instructions de mise à jour multi-tables.

  1. Vérifiez que zipcode "1234" existe dans la table ZIPCODES

    INSERT INTO ZIPCODES 
        (zip, city) 
    VALUES 
        (1234, '?') 
    
  2. écrire des déclarations de mise à jour séparées pour les tables clients et les employés:

    UPDATE CUSTOMERS 
        SET zip = 1234 
    WHERE zip = 4994 
    
    UPDATE EMPLOYEES 
        SET zip = 1234 
    WHERE zip = 4994 
    
  3. supprimer le code précédent:

    DELETE FROM ZIPCODES 
    WHERE zip = 4994 
    
+0

je reçois cette MISE À JOUR ZIPCODES * ERREUR à la ligne 1: ORA-02292: violation de la contrainte d'intégrité - enregistrement enfant trouvé – jon

+0

@jon - le message d'erreur indique que vous mettez à jour la table ZIPCODES, ce qui n'est pas ce que l'OMG Ponies a suggéré. –

0

Utiliser la procédure stockée. Là vous pouvez faire cette opération de table multiple en utilisant des instructions conditionnelles.

+1

Toujours nécessiter plusieurs instructions de mise à jour. Juste tout dans un emballage comme un proc stocké. –

0

Cela peut réduire votre problème. Et vous pouvez mettre à jour ou supprimer dans pour basend en boucle sur les valeurs

Begin 
for Zip_value in 1234.. 4559 loop 
update zipcodes 
    set zip = 0 
where customers.zip = zipcodes.zip 
    and employees.zip = zipcodes.zip; 
    and zipcodes.zip = Zip_value; 
update customers 
    set zip = 0 
where customers.zip = zipcodes.zip 
    and employees.zip = zipcodes.zip; 
    and zipcodes.zip = Zip_value; 
update employees 
    set zip = 0 
where customers.zip = zipcodes.zip 
    and employees.zip = zipcodes.zip; 
    and zipcodes.zip = Zip_value; 
    END LOOP; 
commit; 
end; 
/
1

Je n'ai pas testé - mais: le langage SQL permet des vues actualisables. Si vous regardez here, vous verrez qu'Oracle prend en charge les vues actualisables de manière inhérente. De cette façon, vous pouvez probablement mettre à jour plusieurs tables avec une seule instruction. Il existe certaines restrictions décrites here sur les jointures, mais au moins quelque chose devrait être possible.

Cependant; ceci n'est clairement pas applicable à votre situation, plusieurs déclarations fonctionneraient beaucoup mieux. Ce que vous pourriez considérer est "sur la cascade de mise à jour", de cette façon vous mettriez à jour la table avec les villes avec un nouveau code postal et les clients et les employés seraient mis à jour automatiquement.

Mise à jour: sur la cascade de mise à jour ne fonctionne pas dans Oracle :(Donc déclencheurs ou plusieurs déclarations

Questions connexes