Zoeken…


Syntaxis

  • VERWIJDER [LOW_PRIORITY] [QUICK] [IGNORE] UIT tabel [WHERE conditions] [ORDER BY expression [ASC | DESC]] [LIMIT aantal_rijen]; /// Syntaxis voor het verwijderen van rij (en) uit één tabel

parameters

Parameter Details
LAGE PRIORITEIT Als LOW_PRIORITY is opgegeven, wordt het verwijderen uitgesteld totdat er geen processen meer uit de tabel worden gelezen
NEGEREN Als IGNORE wordt opgegeven, worden alle fouten die zich voordoen tijdens het verwijderen genegeerd
tafel De tabel waaruit u records gaat verwijderen
WAAR voorwaarden De voorwaarden waaraan moet worden voldaan om de records te verwijderen. Als er geen voorwaarden zijn opgegeven, worden alle records uit de tabel verwijderd
BESTELLEN OP expressie Als ORDER BY wordt verstrekt, worden records in de opgegeven volgorde verwijderd
LIMIET Hiermee wordt het maximale aantal records bepaald dat uit de tabel moet worden verwijderd. Gegeven aantal number_rows worden verwijderd.

Verwijder met Where-clausule

DELETE FROM `table_name` WHERE `field_one` = 'value_one'

Hiermee worden alle rijen uit de tabel verwijderd waarbij de inhoud van field_one voor die rij overeenkomt met 'value_one'

De clausule WHERE werkt op dezelfde manier als een select, dus dingen als > , < , <> of LIKE kunnen worden gebruikt.

Opmerking: het is noodzakelijk om voorwaardelijke clausules (WAAR, ZOALS) te gebruiken in de verwijderquery. Als u geen voorwaardelijke clausules gebruikt, worden alle gegevens uit die tabel verwijderd.

Verwijder alle rijen uit een tabel

DELETE FROM table_name ;

Hiermee wordt alles, alle rijen uit de tabel verwijderd. Het is het meest basale voorbeeld van de syntaxis. Het laat ook zien dat DELETE instructies echt met extra zorg moeten worden gebruikt, omdat ze een tabel kunnen leegmaken als de WHERE clausule wordt weggelaten.

BEPERKEN verwijdert

DELETE FROM `table_name` WHERE `field_one` = 'value_one' LIMIT 1

Dit werkt op dezelfde manier als het voorbeeld 'Verwijderen met waar', maar het verwijderen stopt zodra het beperkte aantal rijen is verwijderd.

Als u rijen beperkt voor verwijdering zoals deze, houd er dan rekening mee dat de eerste rij wordt verwijderd die overeenkomt met de criteria. Het is misschien niet degene die je zou verwachten, omdat de resultaten ongesorteerd terug kunnen komen als ze niet expliciet zijn geordend.

Multi-tafel verwijdert

De DELETE instructie van MySQL kan het construct JOIN , waardoor ook kan worden aangegeven uit welke tabellen moet worden verwijderd. Dit is handig om geneste zoekopdrachten te voorkomen. Gezien het schema:

create table people
(    id int primary key,
    name varchar(100) not null,
    gender char(1) not null
);
insert people (id,name,gender) values
(1,'Kathy','f'),(2,'John','m'),(3,'Paul','m'),(4,'Kim','f');

create table pets
(    id int auto_increment primary key,
    ownerId int not null,
    name varchar(100) not null,
    color varchar(100) not null
);
insert pets(ownerId,name,color) values 
(1,'Rover','beige'),(2,'Bubbles','purple'),(3,'Spot','black and white'),
(1,'Rover2','white');
ID kaart naam geslacht
1 Kathy f
2 John m
3 Paul m
4 Kim f
ID kaart OwnerID naam kleur
1 1 zwerver beige
2 2 Bubbles Purper
4 1 Rover2 wit

Als we de huisdieren van Paul willen verwijderen, de verklaring

DELETE p2
FROM pets p2
WHERE p2.ownerId in (
    SELECT p1.id
    FROM people p1
    WHERE p1.name = 'Paul');

kan worden herschreven als:

DELETE p2    -- remove only rows from pets
FROM people p1
JOIN pets p2
ON p2.ownerId = p1.id
WHERE p1.name = 'Paul';

1 rij verwijderd
Spot is verwijderd uit huisdieren

p1 en p2 zijn aliassen voor de tabelnamen, vooral handig voor lange tabelnamen en leesbaarheid.

Om zowel de persoon als het huisdier te verwijderen:

DELETE p1, p2     -- remove rows from both tables
FROM people p1
JOIN pets p2
ON p2.ownerId = p1.id
WHERE p1.name = 'Paul';

2 rijen verwijderd
Spot is verwijderd uit huisdieren
Paul is verwijderd uit Mensen

buitenlandse sleutels

Wanneer de instructie DELETE tabellen met een foreing-sleutel beperkt, kan de optimizer de tabellen verwerken in een volgorde die de relatie niet volgt. Het toevoegen van bijvoorbeeld een externe sleutel aan de definitie van pets

ALTER TABLE pets ADD CONSTRAINT `fk_pets_2_people` FOREIGN KEY (ownerId) references people(id) ON DELETE CASCADE;

de motor kan proberen de vermeldingen van people vóór pets te verwijderen, waardoor de volgende fout wordt veroorzaakt:

ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`pets`, CONSTRAINT `pets_ibfk_1` FOREIGN KEY (`ownerId`) REFERENCES `people` (`id`))

De oplossing in dit geval is om de rij van people te verwijderen en te vertrouwen op de ON DELETE mogelijkheden van InnoDB om de verwijdering te verspreiden:

DELETE FROM people
WHERE name = 'Paul';

2 rijen verwijderd
Paul is verwijderd uit Mensen
Spot wordt bij cascade uit Huisdieren verwijderd

Een andere oplossing is om de controle op sleutels vooraan tijdelijk uit te schakelen:

SET foreign_key_checks = 0;
DELETE p1, p2 FROM people p1 JOIN pets p2 ON p2.ownerId = p1.id WHERE p1.name = 'Paul';
SET foreign_key_checks = 1;

Eenvoudig verwijderen

DELETE FROM `myTable` WHERE `someColumn` = 'something'

De WHERE clausule is optioneel, maar zonder deze worden alle rijen verwijderd.

VERWIJDER versus TRUNCATE

TRUNCATE tableName;

Dit zal verwijderen van alle gegevens en reset AUTO_INCREMENT index. Het is veel sneller dan DELETE FROM tableName op een enorme gegevensset. Het kan erg handig zijn tijdens het ontwikkelen / testen.

Wanneer u afkappen een tafel SQL server niet verwijderen van de gegevens, het daalt de tafel en opnieuw aanmaken, waardoor de pagina's deallocating, dus er is een kans om de afgekapt gegevens voordat de pagina's waar overschreven herstellen. (De spatie kan niet onmiddellijk worden terugverdiend voor innodb_file_per_table=OFF .)

Multi-tafel VERWIJDEREN

Met MySQL kunt u opgeven uit welke tabel de overeenkomende rijen moeten worden verwijderd

    -- remove only the employees
    DELETE e
    FROM Employees e JOIN Department d ON e.department_id = d.department_id
    WHERE d.name = 'Sales'
    -- remove employees and department
    DELETE e, d
    FROM Employees e JOIN Department d ON e.department_id = d.department_id
    WHERE d.name = 'Sales'
    -- remove from all tables (in this case same as previous)
    DELETE
    FROM Employees e JOIN Department d ON e.department_id = d.department_id
    WHERE d.name = 'Sales'


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow