MySQL
USUNĄĆ
Szukaj…
Składnia
- USUŃ [LOW_PRIORITY] [SZYBKO] [IGNORUJ] Z tabeli [GDZIE warunki] [ZAMÓWIENIE WEDŁUG wyrażenia [ASC | DESC]] [LIMIT liczba_wierszy]; /// Składnia usuwania wierszy z pojedynczej tabeli
Parametry
Parametr | Detale |
---|---|
NISKI PRIORYTET | Jeśli podano LOW_PRIORITY , usuwanie będzie opóźnione, dopóki nie zostaną odczytane żadne procesy z tabeli |
IGNOROWAĆ | Jeśli podano IGNORE , wszystkie błędy napotkane podczas usuwania są ignorowane |
stół | Tabela, z której zamierzasz usunąć rekordy |
GDZIE warunki | Warunki, które należy spełnić, aby rekordy mogły zostać usunięte. Jeśli nie zostaną podane żadne warunki, wszystkie rekordy z tabeli zostaną usunięte |
ORDER BY expression | Jeśli podano ORDER BY , rekordy zostaną usunięte w podanej kolejności |
LIMIT | Kontroluje maksymalną liczbę rekordów do usunięcia z tabeli. Podane number_rows zostaną usunięte. |
Usuń za pomocą klauzuli Where
DELETE FROM `table_name` WHERE `field_one` = 'value_one'
Spowoduje to usunięcie wszystkich wierszy z tabeli, w której zawartość pola field_one
dla tego wiersza pasuje do „value_one”
Klauzula WHERE
działa w taki sam sposób, jak zaznaczanie, więc można używać takich rzeczy, jak >
, <
, <>
lub LIKE
.
Uwaga: Konieczne jest użycie klauzul warunkowych (GDZIE, JAK) w kwerendzie usuwania. Jeśli nie użyjesz żadnych klauzul warunkowych, wszystkie dane z tej tabeli zostaną usunięte.
Usuń wszystkie wiersze z tabeli
DELETE FROM table_name ;
Spowoduje to usunięcie wszystkiego, wszystkich wierszy z tabeli. Jest to najbardziej podstawowy przykład składni. Pokazuje także, że instrukcji DELETE
należy naprawdę używać z większą ostrożnością, ponieważ mogą one opróżnić tabelę, jeśli pominięto klauzulę WHERE
.
LIMITOWANIE usuwa
DELETE FROM `table_name` WHERE `field_one` = 'value_one' LIMIT 1
Działa to w taki sam sposób, jak w przykładzie „Usuń z klauzulą Where”, ale zatrzyma usuwanie po usunięciu ograniczonej liczby wierszy.
Jeśli ograniczasz wiersze do usunięcia w ten sposób, pamiętaj, że spowoduje to usunięcie pierwszego wiersza spełniającego kryteria. Może nie być to oczekiwany, ponieważ wyniki mogą wrócić nieposortowane, jeśli nie zostaną wyraźnie uporządkowane.
Usuwa wiele tabel
Instrukcja DELETE
w MySQL może używać konstrukcji JOIN
, pozwalając również określić, z których tabel należy usunąć. Jest to przydatne, aby uniknąć zagnieżdżonych zapytań. Biorąc pod uwagę schemat:
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 | Nazwa | płeć |
---|---|---|
1 | Kathy | fa |
2) | Jan | m |
3) | Paweł | m |
4 | Kim | fa |
ID | ownerId | Nazwa | kolor |
---|---|---|---|
1 | 1 | Wędrowiec | beżowy |
2) | 2) | Bąbelki | fioletowy |
4 | 1 | Rover2 | biały |
Jeśli chcemy usunąć zwierzaki Paula, oświadczenie
DELETE p2
FROM pets p2
WHERE p2.ownerId in (
SELECT p1.id
FROM people p1
WHERE p1.name = 'Paul');
może być przepisany jako:
DELETE p2 -- remove only rows from pets
FROM people p1
JOIN pets p2
ON p2.ownerId = p1.id
WHERE p1.name = 'Paul';
Usunięto 1 wiersz
Spot został usunięty z Pets
p1
i p2
to aliasy nazw tabel, szczególnie przydatne w przypadku długich nazw tabel i łatwości odczytu.
Aby usunąć zarówno osobę, jak i zwierzaka:
DELETE p1, p2 -- remove rows from both tables
FROM people p1
JOIN pets p2
ON p2.ownerId = p1.id
WHERE p1.name = 'Paul';
2 wiersze usunięte
Spot został usunięty z Pets
Paweł został usunięty z People
klucz obcy
Gdy instrukcja DELETE inwoluuje tabele z ograniczeniem klucza Foreing, optymalizator może przetwarzać tabele w kolejności, która nie jest zgodna z relacją. Dodanie na przykład klucza obcego do definicji pets
ALTER TABLE pets ADD CONSTRAINT `fk_pets_2_people` FOREIGN KEY (ownerId) references people(id) ON DELETE CASCADE;
silnik może próbować usunąć wpisy people
przed pets
, powodując następujący błąd:
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`))
Rozwiązaniem w tym przypadku jest usunięcie wiersza z people
i poleganie na możliwościach InnoDB
ON DELETE
celu propagowania usunięcia:
DELETE FROM people
WHERE name = 'Paul';
2 wiersze usunięte
Paweł został usunięty z People
Spot jest kasowany kaskadowo ze Pets
Innym rozwiązaniem jest tymczasowe wyłączenie sprawdzania kluczy Foreing:
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;
Podstawowe usuwanie
DELETE FROM `myTable` WHERE `someColumn` = 'something'
Klauzula WHERE
jest opcjonalna, ale bez niej wszystkie wiersze są usuwane.
DELETE vs TRUNCATE
TRUNCATE tableName;
Spowoduje to usunięcie wszystkich danych i zresetowanie indeksu AUTO_INCREMENT
. Jest to o wiele szybsze niż DELETE FROM tableName
w ogromnym zestawie danych. Może być bardzo przydatny podczas programowania / testowania.
Gdy obcinasz tabelę, SQL Server nie usuwa danych, upuszcza tabelę i odtwarza ją, w ten sposób zwalniając strony, więc istnieje szansa na odzyskanie obciętych danych przed stronami, w których zostały zastąpione. (Nie można natychmiast odzyskać miejsca dla innodb_file_per_table=OFF
.)
USUŃ Multi-table
MySQL pozwala określić, z której tabeli należy usunąć pasujące wiersze
-- 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'