php
  • sql
  • mysql
  • html
  • database
  • 2010-06-03 5 views 1 likes 
    1

    J'ai deux tables. table une table de références b je crois.Je ne peux pas supprimer les enregistrements de MySQL

    Lorsque je tente de supprimer le paquet alltogether comme ceci:

    $query="DELETE a, b FROM classified as a, $sql_table as b WHERE a.ad_id = '$id' 
    AND a.classified_id = b.classified_id AND a.poster_password='$pass'"; 
    

    b DOIT être supprimé d'abord je suppose. Même dans PhpMyAdmin je ne peux pas supprimer a si b est toujours là, donc je supprime b en premier.

    Mais que décide l'ordre dans lequel vient en premier?

    Les tables sont alla InnoDB.

    Que dois-je faire?

    Merci

    +0

    La raison pour laquelle la clé de référence est la façon dont il est, est parce que j'utilise REJOIGNEZ quand je afficher mes dossiers ... Juste pour que vous sachiez. –

    Répondre

    0

    Votre syntaxe Delete n'est pas valide. Vous devez le faire dans deux déclarations (à moins que nuqqsa mentionné, vous avez activé sur SUPPR CASCADE la relation entre la table et un tableau b):

    Delete From b 
    Where Exists (
           Select 1 
           From a 
           Where a.poster_password = '$pass' 
            And a.ad_id = '$id' 
            And a.classified_id = b.classified_id 
           ) 
    
    Delete From a 
    Where a.poster_password = '$pass' 
        And a.ad_id = '$id' 
    

    Ce qui décide qui vient en premier est les relations clés étrangères. Quelle que soit la table, la table parent doit être supprimée en dernier.

    +0

    Vous êtes un utilisateur du serveur SQL, je devine? – racerror

    +0

    @simplemotives - Moi? Je suis, cependant l'équivalent de la syntaxe ci-dessus devrait fonctionner dans n'importe quel produit de base de données. – Thomas

    +0

    @Thomas - Votre style SQL est tout ce que je commentais. – racerror

    2

    Le MySQL manual dit sur les touches multi-tables SUPPRIMER et à l'étranger:

    Si vous utilisez un multiple table SUPPRIMER déclaration impliquant des tables InnoDB pour qui il y a clés étrangères contraintes, l'optimiseur MySQL pourrait les tables de processus dans un ordre qui diffère de celui de leur relation parent/enfant . Dans ce cas, l'instruction échoue et renvoie . Au lieu de cela, vous devez supprimer de une seule table et se baser sur les capacités DELETE DELETE que InnoDB prévoit pour que les autres tables soient modifiées en conséquence.

    Alors que lorsqu'un enregistrement de votre table principale est supprimée, sont donc ses références étrangères, par exemple:

    ALTER TABLE products 
        ADD CONSTRAINT fk_supplier 
         FOREIGN KEY (supplier_id, supplier_name) 
         REFERENCES supplier(supplier_id, supplier_name) 
         ON DELETE CASCADE; 
    
    Questions connexes