impossibile eliminare la tabella utenti, in quanto dipendono altri oggetti su di esso

Voglio abbandonare il mio tabelle nel database.
Ma, quando lo uso, per esempio,
DROP TABLE if exists users;
Ricevo questo messaggio:

cannot drop table users because other objects depend on it

Ho trovato la soluzione per eliminare tutti i database. Ma, in ogni caso, come risolvere questo problema senza la totale rimozione dei dati?

  • basandosi sui vincoli di Chiave esterna è necessario eliminare basandosi sulla condizione
  • Mettere qualche pensiero in quello che stai facendo. Iniziare con giustificano la necessità di eliminare la tabella, in primo luogo.
  • Delete from Tabella2 t dove t.Col1 in ( Select 1 from tabella1 tt dove tt.col1 = t.col1 ) dopo l’eliminazione di ora eliminare la tabella che si desidera eliminare
  • eliminazione di righe nella tabella di riferimento, non aiuta affatto. La chiave esterna deve essere eliminato.
InformationsquelleAutor Vyacheslav | 2016-02-11

 

3 Replies
  1. 37

    Utilizzare il cascade opzione:

    DROP TABLE if exists users cascade;

    questo elimina qualsiasi chiave esterna che fa riferimento alla users tabella o una vista qualsiasi utilizzo.

    Non cadere altri tabelle (o eliminare righe da loro).

    • Saranno le linee di discesa in altre tabelle, che dipende dall’utente?
    • no, solo gocce vincoli di chiave esterna di riferimento la tabella e la tabella stessa, nient’altro saranno cancellati o eliminati
    • Sarà anche cadere qualsiasi punto di vista che fanno riferimento a una tabella.
    • Effettivamente eliminato entrambe le tabelle nel mio caso, quindi essere consapevoli. Credo che questo è accaduto perché ho creato la seconda tabella ereditando dal primo!
    • l’ereditarietà è qualcosa di diverso rispetto a riferimenti di chiave esterna.
    • Thats a destra, si Spera, altri che ottenere questo errore cannot drop table users because other objects depend on it non fare lo stesso errore di prima verifica di quello che il vincolo è. Volevo solo condividere

  2. 8

    Se era proprio necessario far cadere quello specifico tavolo con o senza ricreare, quindi prima di trovare l’oggetto(s) che dipende da esso.

    CREATE OR REPLACE VIEW admin.v_view_dependency AS 
    SELECT DISTINCT srcobj.oid AS src_oid
      , srcnsp.nspname AS src_schemaname
      , srcobj.relname AS src_objectname
      , tgtobj.oid AS dependent_viewoid
      , tgtnsp.nspname AS dependant_schemaname
      , tgtobj.relname AS dependant_objectname
    FROM pg_class srcobj
      JOIN pg_depend srcdep ON srcobj.oid = srcdep.refobjid
      JOIN pg_depend tgtdep ON srcdep.objid = tgtdep.objid
      JOIN pg_class tgtobj ON tgtdep.refobjid = tgtobj.oid AND srcobj.oid <> tgtobj.oid
      LEFT JOIN pg_namespace srcnsp ON srcobj.relnamespace = srcnsp.oid
      LEFT JOIN pg_namespace tgtnsp ON tgtobj.relnamespace = tgtnsp.oid
    WHERE tgtdep.deptype = 'i'::"char" AND tgtobj.relkind = 'v'::"char";

    Quindi,

    select top 99 * from admin.v_view_dependency where src_objectname like '%the_table_name_it_complaint_about%';

    Il set di risultati mostra il dipendente oggetto nel campo “dependant_objectname”.

  3. 3

    In generale, a goccia più interdipendenti tabelle iniziare dalle tabelle che niente dipende (quelli che hanno le chiavi esterne di puntamento per altre tabelle), e lavorare a ritroso. E. g., se la tabella transactions dipende dalla tabella users, sarebbe caduta transactions prima. In breve: Eliminare le tabelle in ordine inverso rispetto a come sono stati creati.

    Se si riesce a creare tabelle di dipendenze circolari, è possibile eliminare il vincolo di chiave esterna che impedisce la cancellazione. Oppure è possibile utilizzare il modificatore CASCADE, che (come @a_horse spiegato nei commenti), eliminerà tutti i vincoli di chiave esterna che coinvolgono la tabella eliminata. Ma si noti che non tutti i DBMS di supporto CASCADE: Postgres, ma MySQL non (la parola chiave è stata accettata, ma non ha alcun effetto).

    • la necessità di verificare e modificare ogni record con una chiave esterna” – questa è una baggianata. Il cascade opzione non controlla tutte le righe il riferimento a tabelle – semplicemente cadute le chiavi esterne. Non cancellare qualsiasi informazione.
    • Stavo andando da tua descrizione: “drop una chiave esterna che utilizza la tabella di utenti”, è necessario modificare il record contenente la chiave esterna. Ma in realtà manuale suggerisce che l’intera tabella figlio è caduto, non solo il record o il tasto: “eliminare Automaticamente gli oggetti che dipendono dalla tabella (come vista).” Puoi chiarire?
    • il dipendente oggetto, in questo caso, è il vincolo di chiave esterna non tabella. drop table ... cascade non eliminare tutte le righe in altre tabelle, e non cadere qualsiasi altra tabella diversa da quella menzionata nel DDL. Vedi qui per una prova: sqlfiddle.com/#!15/8d258/1
    • Grazie per il chiarimento! Corretto.
    • Se si rilascia un database utente con ‘a cascata’ opzione eliminerà tutte dependend oggetti. Per esempio tutte le tabelle che l’utente possiede (e tutti i dati di queste tabelle). Così è possibile inaspettatamente tutti i dati e schema quando si utilizza ‘a cascata’.
    • ti riferisci alla eliminazione di un utente del database, o per la rimozione di un normale tavolo, denominato users che altre tabelle si riferiscono a tramite le chiavi esterne? La domanda riguarda il secondo caso, e come il violino inviato da a_horse_with_no_name dimostra, cascata di eliminazione di una tabella non eliminare le altre tabelle con i riferimenti di chiave esterna. (Leggi table users per table one il violino.)
    • Mi riferisco all’eliminazione di un utente del database (non è una tabella). Volevo solo far notare che non è sempre “sicuro”, per usare la “cascata”, parola chiave. Ho usato a pensare che se il database compains tutto quello che devo fare è aggiungere la “cascata”, parola chiave e il database di fare quello che vuole fare. Ha funzionato fino a quando un giorno ho provato a eliminare un database utente 😛
    • senso: Il DBMS farà quello che gli dici, non quello che vuoi! È anche una cattiva idea di un uso eccessivo ON DELETE CASCADE esteri definizioni fondamentali-è facile perdere un sacco di dati, cancellando una riga nella tabella di riferimento. (E. g. se si elimina un utente in users tabella tutti i record in altre tabelle, che fanno riferimento a questo utente dovrebbe scomparire.)

Lascia un commento