sql >> Database >  >> RDS >> Database

SQL DROP TABLE voor beginners

Als u in SQL een tabel uit een database wilt verwijderen, moet u de DROP TABLE gebruiken verklaring.

Dat vernietigt de tabel en al zijn gegevens.

Syntaxis

De standaardsyntaxis van SQL gaat als volgt:

DROP TABLE <table name> <drop behavior>

Waar:

  • <table name> is de naam van de tafel die u wilt laten vallen.
  • <drop behavior> geeft eventuele opties aan. Dit kunnen ofwel CASCADE . zijn of RESTRICT .

Sommige RDBMS'en accepteren ook een optionele IF EXISTS argument, wat betekent dat er geen fout wordt geretourneerd als de tabel niet bestaat.

Sommige RDBMS'en (zoals MySQL en MariaDB) accepteren ook een optionele TEMPORARY zoekwoord om ervoor te zorgen dat alleen tijdelijke tabellen worden verwijderd.

Oracle accepteert ook een PURGE clausule, die het uit de prullenbak verwijdert.

Voorbeeld

Hier is een voorbeeld om te demonstreren.

DROP TABLE t1;

Als je die code uitvoert, wordt de tabel met de naam t1 drops en al zijn gegevens.

De IF EXISTS Clausule

Hier is een voorbeeld van het gebruik van de IF EXISTS clausule om te controleren of de tabel al bestaat.

DROP TABLE IF EXISTS t1;

Gebruik IF EXISTS zorgt ervoor dat we geen foutmelding krijgen als de tabel niet bestaat.

Dit is wat er gebeurt als we IF EXISTS verwijderen uit de verklaring:

DROP TABLE t1;

Resultaat:

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

Dat is het bericht dat wordt geretourneerd door SQL Server. Uw bericht is afhankelijk van het DBMS dat u gebruikt.

Afhankelijke externe sleutels en weergaven

Sommige RDBMS'en staan ​​een optionele RESTRICT toe of CASCADE trefwoord dat specificeert wat er gebeurt als de tabel externe sleutels of views heeft die ernaar verwijzen.

De RESTRICT Optie

Hier is een voorbeeld van het gebruik van RESTRICT wanneer u probeert een tabel te verwijderen waarnaar wordt verwezen door een externe sleutel in een andere tabel:

DROP TABLE t1 RESTRICT;

Resultaat:

cannot drop table t1 because other objects depend on it

Dit voorbeeld is gedaan met PostgreSQL. RESTRICT is de standaardoptie, dus we zouden hetzelfde resultaat hebben gekregen, zelfs als we de RESTRICT niet hadden opgenomen zoekwoord.

De CASCADE Optie

Dit is wat er gebeurt als we overschakelen naar CASCADE wanneer u probeert dezelfde tabel te verwijderen (waarnaar wordt verwezen door een externe sleutel in een andere tabel):

DROP TABLE t1 CASCADE;

Resultaat:

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

Dit liet de externe sleutel vallen die verwees naar onze t1 tafel. De refererende sleutel heette t2_c2_fkey .

Merk op dat het de tafel met de externe sleutel niet liet vallen. Het liet alleen de externe sleutel vallen.

Als de doeltabel (t1 ) werd verwezen door weergaven, zou de hele weergave zijn verwijderd.

U hoeft CASCADE niet op te geven om indexen, regels, triggers of beperkingen die voor de doeltabel bestaan, te verwijderen. Deze worden automatisch verwijderd, zelfs bij gebruik van de standaardoptie (RESTRICT ).

MySQL en MariaDB

Sommige DBMS'en (zoals MySQL en MariaDB) accepteren de RESTRICT en CASCADE trefwoorden, maar ze doen niets. Ze zijn eenvoudigweg bedoeld om de overdraagbaarheid tussen DBMS'en te vergemakkelijken.

Oracle

Oracle heeft een iets andere syntaxis, CASCADE CONSTRAINTS , die alle referentiële integriteitsbeperkingen laat vallen die verwijzen naar primaire en unieke sleutels in de verwijderde tabel.

SQL-server

SQL Server ondersteunt de CASCADE . niet of RESTRICT trefwoorden. Als de tabel afhankelijk is van externe sleutels, moet u deze verwijderen voordat u de tabel verwijdert, anders krijgt u een foutmelding.

In SQL Server kunt u echter een tabel neerzetten, zelfs als ernaar wordt verwezen door een weergave of opgeslagen procedure. Controleer daarom op dergelijke verwijzingen en verwijder ze expliciet met DROP VIEW of DROP PROCEDURE .

SQLite

SQLite ondersteunt de CASCADE . niet of RESTRICT trefwoorden.

Als er naar de doeltabel wordt verwezen door weergaven, wordt de tabel nog steeds verwijderd (en blijft de weergave behouden).

Als er naar de doeltabel wordt verwezen door externe sleutels, hangt de uitkomst ervan af of u externe sleutels hebt ingeschakeld, en zo ja, of er gegevens in de onderliggende tabel zijn, en zo ja, of de externe sleutel al dan niet is gedefinieerd met ON DELETE CASCADE .

Als u SQLite gebruikt, zie SQLite DROP TABLE voor een voorbeeld en bespreking van het verwijderen van een tabel waarnaar wordt verwezen door een externe sleutel.

Meerdere tabellen laten vallen

Met sommige RDBMS'en kunt u meerdere tabellen verwijderen uit een enkele DROP TABLE verklaring.

Voorbeeld:

DROP TABLE t11, t12;

De RDBMS'en die deze syntaxis ondersteunen, zijn onder meer SQL Server, MySQL, MariaDB en PostgreSQL.

Als u echter een tabel verwijdert waarnaar wordt verwezen door een externe sleutel en die externe sleutel voorkomt dat deze wordt verwijderd, moet u de onderliggende tabel vóór de bovenliggende tabel weergeven.

Als ik bijvoorbeeld de bovenstaande instructie in SQL Server uitvoer, krijg ik de volgende foutmelding:

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

In dit geval kan ik eenvoudig de volgorde van de tabellen in mijn DROP TABLE . wijzigen verklaring:

DROP TABLE t12, t11;

In dit geval kreeg ik eigenlijk nog een foutmelding die me vertelde dat t12 bestaat niet.

Dit is wat ik heb:

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

Dit komt omdat, hoewel de vorige instructie t11 . niet kon laten vallen, , het was in feite succesvol bij het laten vallen van t12 .

En net als een komedie van fouten, kon het deze keer t11 . laten vallen maar niet t12 .

Hoe dan ook, beide tafels zijn nu verwijderd.

Maar als je de bestelling de eerste keer goed krijgt, zou je een bericht als dit moeten ontvangen:

Commands completed successfully.

Het TIJDELIJKE trefwoord

Sommige RDBMS'en (zoals MySQL en MariaDB) accepteren een TEMPORARY zoekwoord.

Het gaat tussen DROP en TABLE , zoals dit:

DROP TEMPORARY TABLE t1;

De TEMPORARY . gebruiken trefwoord zorgt ervoor dat u niet per ongeluk een niet-tijdelijke tafel laat vallen wanneer u probeert een tijdelijke tafel te verwijderen.

De TEMPORARY zoekwoord heeft de volgende effecten:

  • De instructie daalt alleen TEMPORARY tabellen.
  • De instructie veroorzaakt geen impliciete commit (met behulp van DROP TABLE zonder de TEMPORARY trefwoord begaat automatisch de huidige actieve transactie).
  • Er zijn geen toegangsrechten aangevinkt. Een TEMPORARY tabel is alleen zichtbaar met de sessie die deze heeft gemaakt, dus er is geen controle nodig.

De zuiveringsclausule

Oracle heeft een optionele PURGE clausule, die u kunt gebruiken als u de tabel wilt verwijderen en de bijbehorende ruimte in één stap wilt vrijgeven. Als u PURGE opgeeft , dan plaatst de database de tabel en de afhankelijke objecten niet in de prullenbak.

Dit komt overeen met het eerst laten vallen van de tafel en deze vervolgens uit de prullenbak verwijderen, maar het bespaart u één stap in het proces.

Merk op dat als u PURGE opgeeft, , kunt u de tabel niet herstellen.

Als u PURGE niet opgeeft , de DROP TABLE statement resulteert niet in het teruggeven van ruimte aan de tablespace voor gebruik door andere objecten, en de ruimte blijft meetellen voor het ruimtequotum van de gebruiker.


  1. Een externe sleutel toewijzen aan een aangepaste kolomnaam

  2. Isql gebruiken met een Connection String

  3. Hoe ArangoDB op Ubuntu 20.04 te installeren

  4. Kan niet inloggen op SQL Server + SQL Server-verificatie + fout:18456