sql >> Databasteknik >  >> RDS >> Database

SQL DROP TABLE för nybörjare

I SQL, om du vill ta bort en tabell från en databas, måste du använda DROP TABLE uttalande.

Det förstör tabellen och all dess data.

Syntax

SQL-standardsyntaxen ser ut så här:

DROP TABLE <table name> <drop behavior>

Var:

  • är namnet på tabellen du vill släppa.
  • anger eventuella alternativ. Dessa kan vara antingen CASCADE eller RESTRICT .

Vissa RDBMS accepterar även en valfri OM FINNS argument som innebär att det inte returnerar ett fel om tabellen inte finns.

Vissa RDBMS:er (som MySQL och MariaDB) accepterar också en valfri TILLÄMPLIG nyckelord för att säkerställa att endast tillfälliga tabeller tas bort.

Oracle accepterar också en PURGE klausul, som rensar den från papperskorgen.

Exempel

Här är ett exempel att visa.

DROP TABLE t1;

Om du kör den koden försvinner tabellen som heter t1 och alla dess data.

OM FINNS Klausul

Här är ett exempel på hur du använder OM FINNS sats för att kontrollera om tabellen redan finns.

DROP TABLE IF EXISTS t1;

Använder OM FINNS säkerställer att vi inte får ett felmeddelande om tabellen inte finns.

Så här händer om vi tar bort OM FINNS från uttalandet:

DROP TABLE t1;

Resultat:

Msg 3701, Level 11, State 5, Line 1
Cannot drop the table 't1', because it does not exist or you do not have permission.

Det är meddelandet som returneras av SQL Server. Ditt meddelande beror på vilket DBMS du använder.

Beroende främmande nycklar och vyer

Vissa RDBMS tillåter en valfri RESTRICT eller CASCADE nyckelord som anger vad som händer om tabellen har några främmande nycklar eller vyer som refererar till den.

RESTRICT Alternativ

Här är ett exempel på hur du använder RESTRICT när du försöker släppa en tabell som refereras av en främmande nyckel i en annan tabell:

DROP TABLE t1 RESTRICT;

Resultat:

cannot drop table t1 because other objects depend on it

Detta exempel gjordes med PostgreSQL. RESTRICT är standardalternativet, så vi skulle ha fått samma resultat även om vi inte hade inkluderat RESTRICT nyckelord.

CASCADE Alternativ

Här är vad som händer om vi byter till CASCADE när du försöker släppa samma tabell (som refereras av en främmande nyckel i en annan tabell):

DROP TABLE t1 CASCADE;

Resultat:

NOTICE:  drop cascades to constraint t2_c2_fkey on table t2
Commands completed successfully

Detta tog bort den främmande nyckeln som hänvisade till vår t1 tabell. Den främmande nyckeln kallades t2_c2_fkey .

Observera att den inte tappade tabellen som hade den främmande nyckeln. Den tappade bara den främmande nyckeln.

Om måltabellen (t1 ) refererades av alla vyer, skulle hela vyn ha tagits bort.

Du behöver inte ange CASCADE för att ta bort alla index, regler, utlösare eller begränsningar som finns för måltabellen. Dessa tas bort automatiskt, även när du använder standardalternativet (RESTRICT ).

MySQL och MariaDB

Vissa DBMS:er (som MySQL och MariaDB) accepterar RESTRICT och CASCADE sökord, men de gör ingenting. De tillhandahålls helt enkelt för enklare portabilitet mellan DBMS.

Oracle

Oracle har en något annorlunda syntax, CASCADE CONSTRAINTS , vilket tar bort alla referensintegritetsbegränsningar som hänvisar till primära och unika nycklar i den släppta tabellen.

SQL-server

SQL Server stöder inte CASCADE eller RESTRICT nyckelord. Om tabellen har några beroenden av främmande nyckel måste du släppa dem innan du släpper tabellen, annars får du ett felmeddelande.

Men i SQL Server kan du släppa en tabell även om den refereras av en vy eller lagrad procedur. Därför bör du leta efter sådana referenser och uttryckligen släppa dem genom att använda DROP VIEW eller SLÄPPPROCEDUR .

SQLite

SQLite stöder inte CASCADE eller RESTRICT nyckelord.

Om måltabellen refereras av någon vy kommer tabellen fortfarande att tas bort (och vyn kommer att finnas kvar).

Om måltabellen refereras av några främmande nycklar, kommer resultatet att bero på om du har främmande nycklar aktiverade, och i så fall om det finns några data i den underordnade tabellen, och i så fall om den främmande nyckeln är definierad med PÅ DELETE CASCADE .

Om du använder SQLite, se SQLite DROP TABLE för ett exempel och diskussion om att ta bort en tabell som refereras av en främmande nyckel.

Släpp flera tabeller

Vissa RDBMS:er låter dig släppa flera tabeller från en enda DROP TABLE uttalande.

Exempel:

DROP TABLE t11, t12;

RDBMS som stöder denna syntax inkluderar SQL Server, MySQL, MariaDB och PostgreSQL.

Men om du släpper en tabell som refereras av en främmande nyckel, och den främmande nyckeln förhindrar att den släpps, måste du lista den underordnade tabellen före den överordnade tabellen.

Till exempel, om jag kör ovanstående sats i SQL Server får jag följande felmeddelande:

Msg 3726, Level 16, State 1, Line 1
Could not drop object 't11' because it is referenced by a FOREIGN KEY constraint.

I det här fallet kan jag helt enkelt byta ordning på tabellerna i min DROP TABLE uttalande:

DROP TABLE t12, t11;

I det här fallet fick jag faktiskt ett annat felmeddelande om att t12 finns inte.

Det här är vad jag fick:

Msg 3701, Level 11, State 5, Line 1
Cannot drop the table 't12', because it does not exist or you do not have permission.

Detta beror på att, även om det tidigare uttalandet inte kunde släppa t11 , lyckades den faktiskt ta bort t12 .

Och precis som en komedi av misstag kunde den den här gången släppa t11 men inte t12 .

Oavsett så har båda borden nu tagits bort.

Men om du får rätt beställning första gången bör du få ett meddelande så här:

Commands completed successfully.

Det TILLfälliga sökordet

Vissa RDBMS:er (som MySQL och MariaDB) accepterar en TILLÄMPLIG nyckelord.

Det går mellan DROP och TABELL , så här:

DROP TEMPORARY TABLE t1;

Använda TEMPORARY sökord säkerställer att du inte av misstag tappar en icke-tillfällig tabell när du försöker släppa en tillfällig tabell.

Den TILLÄMPLIGA nyckelordet har följande effekter:

  • Satsen släpps endast TILLÄMPLIG tabeller.
  • Utsatsen orsakar inte en implicit commit (med DROP TABLE utan TEMPORARY nyckelordet begår automatiskt den aktuella aktiva transaktionen).
  • Inga åtkomsträttigheter är markerade. En TIMPORÄR Tabellen är endast synlig med den session som skapade den, så ingen kontroll behövs.

Utrensningsklausulen

Oracle har en valfri PURGE klausul, som du kan använda om du vill släppa tabellen och frigöra utrymmet som är associerat med det i ett enda steg. Om du anger PURGE , då placerar databasen inte tabellen och dess beroende objekt i papperskorgen.

Detta motsvarar att först släppa bordet och sedan tömma det från papperskorgen, men det låter dig spara ett steg i processen.

Observera att om du anger PURGE , kommer du inte att kunna återställa tabellen.

Om du inte anger PURGE , DROP TABELL uttalandet leder inte till att utrymme frigörs tillbaka till tabellutrymmet för användning av andra objekt, och utrymmet fortsätter att räknas mot användarens utrymmeskvot.


  1. Problem med att importera en txt-fil till postgres med php

  2. ORA-01264:Det går inte att skapa loggfilnamn

  3. REGEXP_COUNT() Funktion i Oracle

  4. phpMyAdmin - kan inte ansluta - ogiltiga inställningar - ända sedan jag lade till ett root-lösenord - låst ute