mysql delete statement delete command syntax
Този урок обяснява как да използвам изявлението DELETE на MySQL за изтриване на данни от таблица или изтриване на цялата таблица и разликата между командите за отрязване и изтриване:
В MySQL DELETE е език за управление на данни или DML, както знаем.
Както подсказва самото име, командата се използва за изтриване на редове от таблицата. Използвайки тази команда, можем да изтрием един или повече нежелани редове в една транзакция. Има няколко начина за изтриване на записи от таблица с помощта на командата DELETE.
конвертирате char в int c ++
В този урок ще обсъдим всичко това в детайли, заедно с прости примери.
Какво ще научите:
- Команда за изтриване на MySQL
- Разлика между TRUNCATE И DELETE изявления
- Референтна почтеност и нейното въздействие върху DELETE
- Често задавани въпроси и отговори
- Заключение
Команда за изтриване на MySQL
Има важен фактор, който трябва да имате предвид, преди да продължим напред. Всеки ред или няколко реда, които изтриваме с помощта на командата DELETE, никога не могат да бъдат извлечени.
По този начин, за да се избегнат сценарии, при които ред се изтрива по погрешка, препоръчително е да направите резервно копие на таблицата, преди да изпълните оператора DELETE. По-късно можем да използваме този архив, за да възстановим таблицата в случай на грешки.
Забележка: Използваме MySQL версия 8.0. Можете да го изтеглите от тук .
Синтаксис на MySQL Delete:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tablename[.*] [, tablename[.*]] [WHERE condition] [ORDER BY] [LIMIT row_count] ;
Обяснение на синтаксиса:
- Синтаксисът започва с ключовата дума „ИЗТРИВАНЕ ОТ”, като по този начин информира MySQL сървъра за вида дейност, която трябва да се извърши. Това е задължителна ключова дума и не може да бъде пропусната.
- След това идва името на таблицата, в която трябва да се извърши операцията DELETE. Това също е задължително и не може да се пропусне. Тук можем да споменем едно или повече имена на таблици.
- След това можем да споменем всяко условие, което контролира допустимостта на редовете, които трябва да бъдат изтрити. Това е клауза по избор. Ключовата дума тук е КЪДЕ.
- Следва клаузата WHERE е клаузата ORDER BY, която налага редовете да бъдат изтрити в определен ред, възходящ или низходящ, в колона (и). Това е клауза по избор.
- Клаузата LIMIT следва клаузата ORDER BY. Той поставя ограничение за броя редове, които операторът DELETE може да премахне от таблицата.
Модификатори в изявление DELETE
# 1) LOW_PRIORITY:
Този модификатор информира MySQL Engine да забави изпълнението на оператора DELETE до момента, в който няма връзки, четящи от таблицата, от които се опитваме да DELETE.
Това помага за постигане на последователност във всички други операции, които ще бъдат извършени на тази маса. Това също помага за избягване на проблеми със заключването на таблицата.
# 2) БЪРЗ:
Всеки път, когато изтрием ред, съответният индекс също се изтрива. Възстановяването на пространството по време на изпълнение на изявлението DELETE отнема времето на процесора. Ако използваме ключовата дума QUICK, тогава съответното индексно пространство остава неизползвано и може да се използва, когато се вмъкнат нови записи, които отговарят на изтрития по-рано диапазон на индекса.
Например, помислете за таблица на служител, където идентификаторът на служителя е индексът. Всеки път, когато служител напусне организация, трябва да изтрием съответния запис. Ако използваме клаузата QUICK, тогава съответното индексно пространство ще остане неизползвано.
Когато се присъедини нов служител, той ще получи нов номер на служител, а не същия номер на напусналия. В такива примери не е препоръчително да използвате БЪРЗО.
MYSQL DELETE Пример
По-долу е дадена примерна таблица, създадена в MYSQL.
Име на схемата: тихоокеански
Име на таблицата: служители
Имена на колони:
empNum; Съдържа целочислени стойности за номера на служителя.
фамилия: Съдържа стойности на varchar за фамилното име на служителя.
първо име: Съдържа стойности на varchar за собственото име на служителя.
електронна поща: Съдържа стойности на varchar за имейл адреса на служителя.
deptNum; Съдържа varchar за идентификатора на отдела, към който принадлежи служител.
заплата: Съдържа десетични стойности на заплатата на всеки служител.
начална дата: Съдържа стойностите на датите за датата на присъединяване на служителя.
Име на схемата: тихоокеански
Име на таблицата: Служители_история
Имена на колони:
empNum; Съдържа целочислените стойности за броя на служителите.
фамилия: Съдържа стойности на varchar за фамилното име на служителя.
първо име: Съдържа стойности на varchar за собственото име на служителя.
електронна поща: Съдържа стойности на varchar за имейл адреса на служителя.
deptNum; Съдържа varchar за идентификатора на отдела, към който принадлежи служител.
заплата: Съдържа десетични стойности на заплатата на всеки служител.
начална дата: Съдържа стойности за датата на присъединяване на служителя.
Име на схемата: тихоокеански
Име на таблицата: отдели
Имена на колони:
deptNum; Съдържа varchar за идентификатора на отдела в рамките на организация.
град: Съдържа името на града, от който работят отделите.
страна: Съдържа името на държавата, съответстваща на града.
бонус: Съдържа процентната стойност на бонуса.
MySQL Изтриване на един ред
Първият и по-лесен начин за изтриване на записи от таблицата при изтриване на записите един по един, като се използва много силна клауза WHERE, която гарантира изтриването само на един подходящ запис. Това може да се използва допълнително за изтриване на набор от подобни видове редове от таблицата.
Да разгледаме подробно изявлението за изтриване и неговото изпълнение.
Тук ще се опитаме да премахнем служител на име „Крис Нолан“ с номер на служителя 1013.
Както е показано на снимката по-горе, изявлението DELETE е изпълнено успешно и е изтрил един ред от таблицата на служителя.
The изход инструкция по-долу показва времето, в което е изпълнено изявлението, MySQL изразът, който е изпълнен и броят на редовете, които са били засегнати.
Моля, бъдете много сигурни относно клаузата WHERE тук. Ако клаузата WHERE е неправилна или ако пропуснете да имате клауза WHERE, това може да доведе до загуба на данни. За да се избегнат подобни ситуации, в производството има практика на периодично архивиране или разтоварване на данни.
За да проверим изхода на този оператор DELETE, нека изпълним оператора SELECT на тази таблица с empNum като 1013.
Изходните резултати показват NULL стойност за всички колони, което означава, че не съществува запис за такъв empNum. Изходът на заявката по-долу показва, че са върнати 0 реда (а), което означава, че записът е бил изтрит от изпълнението на изявлението DELETE по-горе.
Запитване:
DELETE FROM employees WHERE empNum = 1013 ;
Снимка на таблица след:
empNum | фамилия | първо име | електронна поща | deptNum | Заплата |
---|---|---|---|---|---|
7 | Това е относително забавено от TRUNCATE, когато се сравнява за изтриване на цели данни от таблицата. | Това е относително по-бързо от DELETE, в сравнение с изтриването на цели данни от таблицата. | |||
НУЛА | НУЛА | НУЛА | НУЛА | НУЛА | НУЛА |
MySQL ИЗТРИВАНЕ, използвайки клауза ORDER BY AND LIMIT
ORDER BY и LIMIT са две клаузи, които обсъдихме по-горе. Първият помага при решаването на реда, в който записите трябва да бъдат изчистени, или изтриване на записи с empNum във възходящ ред, или изтриване на записи с заплата в низходящ ред. Последното помага за ограничаване на броя записи, които тази транзакция може да изтрие.
Например, ако искаме да изтрием само 2 служители, принадлежащи към отдел номер 4, които взимат високи заплати. Тогава има три части на тази заявка.
- Първо, трябва да изчистим служителите от отдел номер 4. Това ще бъде обработено от клауза WHERE.
- Следващия, трябва да прочистим служители, които печелят високи заплати. Това ще бъде обработено от клаузата ORDER BY в колоната на заплатата в низходящ ред.
- И накрая, трябва да прочистим само двама служители. Това ще бъде обработено от клаузата LIMIT.
Нека да разгледаме заявката DELETE и да видим резултатите. Преди да направим това, нека първо определим кои са точните записи, които искаме да изтрием. Ще използваме горните условия с оператор SELECT, за да получим записите, които искаме да изтрием, и по-късно да изпълним същата заявка, за да проверим дали тези записи са изтрити или не.
В горната заявка SELECT сме изпълнили всичките три условия, за които говорихме по-горе, използвайки клаузата WHERE, ORDER BY и LIMIT. Заявката ни даде 2 записа, един с empNum 1010 и друг със 1007. Сега ще изпълним заявката DELETE, за да гарантираме, че тези два записа са изтрити.
Както е показано на снимката по-горе, изявлението DELETE е изпълнено успешно и е изтрило два реда от таблицата на служителя. The изход инструкция по-долу показва времето, в което е изпълнено изявлението, MySQL изразът, който е изпълнен и броят на редовете, които са били засегнати.
За да проверим изхода на този оператор DELETE, нека изпълним SELECT за empNum 1010 и 1007. Не можем да използваме същата заявка SELECT, както е използвана по-горе, която би показала останалите служители под deptNum 4.
Резултатните резултати показват NULL стойност за всички колони, което означава, че не съществува запис за такива номера на служители. The Изход от заявката по-долу показва, че са върнати 0 реда (а), което означава, че записът е бил изтрит чрез изпълнението на изявлението DELETE по-горе.
Запитване:
DELETE FROM employees WHERE deptNum = 4 ORDER BY salary DESC LIMIT 2 ;
Снимка на таблица след:
empNum | фамилия | първо име | електронна поща | deptNum | Заплата |
---|---|---|---|---|---|
НУЛА | НУЛА | НУЛА | НУЛА | НУЛА | НУЛА |
MySQL DELETE Използване на клауза за избор
След това ще преминем през използването на клаузата SELECT, докато изтриваме записи от една таблица.
Обмислете следния сценарий:
Имаме два комплекта таблици: служители и отдели. deptNum е като първичен ключ в таблицата на отдела и външен ключ в таблицата на служителя. Това означава, че ако на служител е назначен отдел, той трябва да е от един от отделите в таблицата на отделите.
Сега трябва да изтрием тези записи от таблицата на отдела, където досега не е назначен служител. Можем да направим това, като имаме клауза SELECT в подзаявката на заявка DELETE.
Нека първо идентифицираме записите, които искаме да изтрием:
Горната SELECT заявка има подзаявка.
Функционирането на заявката е както следва:
Заявката изтегля всички записи от таблицата на отдела, където deptNum не съществува в таблицата на служителя. Присъединяването се извършва в подзаявката на deptNum на двете таблици.
как да стартирам jar файл в Windows 10
Сега нека стартираме заявката DELETE и да видим дали можем да изтрием тези два записа от таблицата на отдела, тъй като на тези отдели не е назначен служител.
Както е показано на горната снимка, операторът за изтриване е изтрил 2 реда от таблиците на отделите, в които няма назначен служител.
За да проверим изхода на този оператор DELETE, нека изпълним SELECT на таблицата и да видим какво имаме в изхода.
Изходното съобщение на горната заявка за потвърждение казва „върнати 0 ред (и)“. Това предполага, че редовете с deptNum 6 и 7 се изтриват. Изходът също не показва записи, вместо да показва NULL стойности, тъй като записите са изтрити.
Запитване:
DELETE FROM departments WHERE NOT EXISTS (SELECT deptNum FROM employees WHERE departments.deptNum = employees.deptNum ) ;
MySQL DELETE Цяли данни от таблица
След това ще разгледаме сценария, при който трябва да изтрием всички редове или записи от таблица.
В производствената ситуация може никога да не срещнете такава ситуация. Но такива неща биха били необходими в зоната за разработка, където трябва да тествате кода си с множество различни сценарии и може да искате да пресъздадете нов набор от тестови данни, като изтриете записите, съществуващи в таблицата.
Първо, нека да разгледаме данните, които възнамеряваме да изтрием. Ще се опитаме да изтрием данни от таблицата staff_history.
По-долу са дадени настоящите данни в таблицата.
Тук имаме 18 реда в таблицата staff_history. Нека сега да изтрием всичко това в една транзакция. Заявката е почти подобна на тази, която обсъдихме в първия раздел. Единствената промяна е, че трябва да премахнем клаузата WHERE от заявката, така че да няма ограничение за броя редове, които искаме да изтрием.
Както е показано на горната снимка, операторът за изтриване е изпълнен успешно и е изтрил всичките 18 реда от таблицата staff_history. Изходният оператор по-долу показва времето, в което е бил изпълнен операторът, MySQL изразът, който е бил изпълнен, и броят на редовете, които са били засегнати.
За да проверим изхода на този оператор DELETE, нека изпълним SELECT на таблицата и да видим какво имаме в изхода.
Резултатните резултати показват NULL стойност за всички колони, което означава, че не съществува запис за такива номера на служители. Изходът на заявката по-долу показва, че са върнати 0 реда (а), което означава, че всички записи са изтрити при изпълнението на горния оператор DELETE.
Запитване:
DELETE FROM employees_history ;
Снимка на таблица след:
empNum | фамилия | първо име | електронна поща | deptNum | Заплата |
---|---|---|---|---|---|
НУЛА | НУЛА | НУЛА | НУЛА | НУЛА | НУЛА |
MySQL DELETE Цяла таблица
Сега ще разгледаме сценария, при който трябва да изтрием самата таблица. На термин SQL го наричаме DROP the table. Няма значение дали таблицата има някакви данни или не. Той просто ще пусне таблицата заедно с данните, ако има такива.
В горния раздел изтрихме данните от таблицата staff_history. В този раздел ще изпуснем самата таблица staff_history.
Следва командата заедно с нейния изход:
Както е показано на горната снимка, изявлението DROP е изпълнено успешно и е изтрило таблицата staff_history от системния каталог на базата данни MySQL.
Ако погледнете съобщението, то ще покаже „0 реда (и) засегнати“. Това е така, защото бяхме изтрили всичките 18 реда в предишния раздел. Ако тази таблица имаше някакви редове, тогава този брой редове ще бъде засегнат, което предполага изтриване.
За да проверим изхода на този DROP оператор, нека изпълним SELECT на таблицата и да видим какво имаме в изхода.
Изходното съобщение на горната заявка за потвърждение казва, че таблицата не съществува. Това потвърждава изпълнението ни на горния DROP оператор, за да пуснем таблицата.
Запитване:
DROP TABLE employees_history ;
Команда за отрязване на MySQL
Вече обсъдихме изтриването на всички записи от таблицата с помощта на командата DELETE. Същото може да се постигне и с помощта на израза TRUNCATE.
За този пример, нека да създадем отново таблицата на staff_history и да я попълним отново с данни. т по-долу са двете заявки, които са били изпълнени за пресъздаване на таблицата и повторно попълване:
Запитване:
CREATE TABLE employees_history LIKE employees ; INSERT INTO employees_history (SELECT * FROM employees) ;
Ето как изглежда таблицата staff_history сега с данни.
След това ще премахнем всички записи от тази таблица с помощта на израза TRUNCATE.
Както е показано на снимката, заявката се изпълнява успешно. Ако разгледате отблизо частта „Съобщение“, ще откриете, че в нея пише „0 засегнати ред (и)“. Знаем обаче, че тази таблица има 15 реда в нея. Тогава как е, че показва нула?
Причина: Операторът за отрязване не се грижи да отчита броя на редовете, засегнати от неговото изпълнение. Просто изпразва масата. Това е една от съществените разлики между изявленията DELETE и TRUNCATE.
как да видите .dat файл
Нека проверим изпълнението на израза TRUNCATE, като изпълним заявка SELECT в таблицата служители_история.
Както е показано на снимката по-горе, заявката не е върнала редове, а също така всички колони показват NULL стойности, което означава, че изразът TRUNCATE, който изпълнихме по-рано, е изтрил всички записи от таблицата.
Запитване:
TRUNCATE TABLE employees_history ;
Разлика между TRUNCATE И DELETE изявления
Господин Не | ИЗТРИЙ | ПРЕКРАТЕТЕ |
---|---|---|
един | Това е DML (език за манипулиране на данни). | Това е DDL (език за дефиниране на данни). |
две | Всеки задействащ AFTER DELETE на масата се активира, когато използваме командата DELETE. | Нито един спусък след изтриване на таблицата не се активира, когато използваме командата TRUNCATE. |
3 | Записът може да бъде изтрит, дори ако има някакви ограничения за външен ключ. | Записите от таблицата не могат да бъдат съкратени, ако има ограничения за външен ключ. |
4 | Повторната инициализация на таблицата няма да се случи. | Таблицата ще бъде повторно инициализирана. |
5 | Може да се използва клауза WHERE. | Клаузата WHERE не може да се използва. |
6 | Това изтрива по един запис наведнъж и запазва запис на общия брой изтрити записи в дневниците. | Той прочиства всички записи наведнъж и не записва броя на изтритите записи. |
Референтна почтеност и нейното въздействие върху DELETE
Преди да бъдем, да видим какво е референтната цялост или ограниченията на RI или външния ключ?
Външните ключови ограничения са свързани с установяването на връзка или връзка между таблицата родител и дете. Това помага при кръстосано препращане към данните в таблиците, които са свързани помежду си. Една родителска таблица може да има множество дъщерни таблици и обратно.
Например, двете таблици, които обсъждахме досега, т.е. служители и отдели, са свързани помежду си с помощта на външен ключ. Това ограничение се установява чрез създаване на една колона, обикновено първичен ключ, като ключова колона, свързваща две таблици.
Колоната deptNum в таблицата на отдела е свързана с колоната deptNum в таблицата на служителя. В този случай отделите са родителската таблица, а служителите - дъщерната таблица.
Но как това се отразява на изявленията DELETE?
В MySQL или във всяка база данни има определени сценарии, които трябва да се обработват при изтриване на записи от родителската или дъщерната таблица.
Има множество опции за справка, които можем да обсъдим:
# 1) НА ИЗТРИВАНЕ НА КАСКАДА: Правилото казва, че не можем да премахнем ред от родителската таблица, ако тя има някакви препратки или има съответния ред в някоя от дъщерните таблици. Ако обаче родителска таблица има доста дъщерни таблици, тогава е досадна задача първо да премахнете записите от всяка дъщерна таблица и след това от родителската таблица.
За това има заобиколно решение, наречено „ИЗТРИВАНЕ НА КАСКАДА“. Това е една клауза, която се добавя към израза CREATE на всяка от дъщерните таблици. Така че, когато казваме изтриване на ред от родителската таблица, тогава двигателят MySQL първо ще идентифицира референциите на този ред в дъщерните таблици и ще премахне тези записи и накрая ще изтрие записа от родителската таблица.
# 2) БЕЗ ДЕЙСТВИЕ: Това е опция по подразбиране. Ако изпълнението на оператор DELETE се опита да изтрие запис, който има препратки в някоя от дъщерните таблици, тогава с тази опция изпълнението на оператора ще спре и MySQL транзакция ще се върне към последната точка на фиксиране.
# 3) ОГРАНИЧЕНИЕ: Функционирането на RESTRICT и NO ACTION са еднакви. Това ще спре изпълнението и ще издаде връщане назад.
# 4) ЗАДАВАНЕ НА НУЛА: Ако изпълнението на оператор за изтриване се опита да изтрие запис, който има препратки в някоя от дъщерната таблица, тогава тази опция ще актуализира стойността на колоната във всички дъщерни таблици като NULL и след като приключи, тя ще изтрие записа от родителя маса.
# 5) ЗАДАВАНЕ ПО подразбиране: Ако изпълнението на оператор DELETE се опита да изтрие запис, който има препратки в някоя от дъщерните таблици, тогава тази опция ще актуализира стойностите на колоните до стойността по подразбиране, както е дефинирана в оператора CREATE на таблицата.
Често задавани въпроси и отговори
В # 1) Как да изтрия данни от таблицата в MySQL?
Отговор: Синтаксисът на командата delete за изтриване само на избран ред от данни е даден по-долу.
DELETE FROM table_name WHERE condition;
В # 2) Как да изтрия всички данни от таблицата в MySQL?
Отговор: Синтаксисът на командата DELETE за изтриване на всички редове от таблицата е:
DELETE * FROM table_name;
В # 3) Как да изтрия таблицата от базата данни в MySQL?
Отговор: Командата drop може да се използва за изтриване на таблицата от базата данни. Потребителят може да замени table_name с таблицата, която трябва да бъде изтрита.
DROP TABLE table_name;
В # 4) Как да изтрия базата данни в MySQL?
Отговор: Командата drop може да се използва за изтриване на базата данни.
DROP Database db_name;
Потребителите могат да заменят db_name с името на базата данни, което трябва да бъде изтрито.
В # 5) Какво е НА ИЗТРИВАНЕ НА КАСКАДА в MySQL?
Отговор: Когато родителският запис бъде изтрит, ON DELETE CASCADE създава съвпадащ дъщерен запис, който да бъде изтрит. По този начин ефектът от изтриването е каскаден от родителя към детето. Това може да бъде полезно при извършване на изтриване на множество таблици.
В # 6) Защо TRUNCATE се счита за DDL израз?
Отговор: Операторът TRUNCATE всъщност пада и пресъздава таблицата заедно с метаданните на таблицата. По този начин това е DDL извлечение.
В # 7) Може ли TRUNCATE да бъде върнат обратно?
Отговор: Не, TRUNCATE е оператор за автоматично фиксиране, ако се изпълнява самостоятелно. Това означава, че той не може да бъде върнат обратно, тъй като коммитът също се изпълнява заедно с него. Но ако това е част от транзакция, тя може да бъде върната обратно с помощта на SQL Log Files.
В # 8) Може ли операторите DELETE да бъдат върнати обратно?
Отговор: Да, изявленията DELETE могат да бъдат върнати обратно. Просто изпълнете командата ROLLBACK, преди да изпълните COMMIT.
В # 9) Може ли да се изтрие колона с помощта на командата DELETE?
Отговор: Добавянето или изтриването на колони са DDL команди. Изразът ALTER трябва да се използва, за да се откаже колона от таблицата.
Заключение
В този урок научихме различни начини за изпълнение на оператори DELETE в MySQL.
Накратко видяхме:
- MySQL Изтриване на един ред
- Изтриване на MySQL, като се използва клауза ORDER BY и Limit
- MySQL Delete с помощта на клауза за избор
- MySQL Изтриване на цялата таблица
- MySQL Truncate
- Разлика между TRUNCATE и DELETE изрази
- Референтна почтеност и нейното въздействие върху DELETE
Можем да използваме някое от горните, въз основа на изискването.
Честито четене !!
Препоръчително четене
- Синтаксис на командата Unix Cat, Опции с примери
- Команда за сортиране на Unix със синтаксис, опции и примери
- MySQL Вмъкване в таблица - Вмъкване на изявление Синтаксис и примери
- MongoDB Актуализиране и изтриване на документ с примери
- Изрежете командата в Unix с примери
- Нови / Изтриване на оператори в C ++ с примери
- Урок за изявление за актуализация на MySQL - Синтаксис и примери за актуализиране на заявки
- Ls Command в Unix с примери