Оператор DELETE (Microsoft Access SQL)
Создает запрос на удаление, который удаляет записи из одной или нескольких таблиц, указанных в предложении FROM, отвечающих предложению WHERE.
Синтаксис
DELETE [table.*] FROM table WHERE criteria
Оператор DELETE состоит из следующих частей:
Необязательное имя таблицы, из которой удаляются записи.
Имя таблицы, из которой удаляются записи.
Выражение, определяющее, какие записи нужно удалить.
Комментарии
DELETE особенно полезен, если вы хотите удалить большое количество записей.
Чтобы удалить всю таблицу из базы данных, можно использовать метод Execute с оператором DROP. Однако, если удалить таблицу, может потеряться структура. С другой стороны при использовании DELETE удаляются только данные; а структура таблицы и все ее свойства, такие как атрибуты поля и индексы, остаются нетронутыми.
Вы можете использовать DELETE, чтобы удалить записи из таблиц, которые находятся в связи «один ко многим» с другими таблицами. Операции каскадного удаления вызывают удаление записей в таблицах, расположенных на стороне многих связей, при удалении соответствующей записи на стороне одной связи при запросе. Например, в связи между таблицами Клиенты и Заказы, таблица Клиенты находится на стороне одной связи, а таблица Заказы находится на стороне многих связей. Удаление записи из результатов клиентов в соответствующих записях заказов, удаляемых в случае, если указан параметр каскадного удаления.
Запрос на удаление удаляет записи целиком, а не только данные в определенных полях. Если вы хотите удалить значения в определенном поле, создайте обновленный запрос, который изменяет значение на Null.
- После удаления записи с помощью запроса на удаление невозможно отменить данную операцию. Если вы хотите узнать, какие записи были удалены, сначала проверьте результаты запроса на выборку, в котором используется то же самое условие, и снова запустите запрос на удаление.
- Сохраняйте резервные копии ваших данных в любое время. Если вы удалили не те записи, вы сможете восстановить их из резервных копий.
Пример
В этом примере будут удалены все записи для сотрудников, чья должность — стажер. Если оператор FROM содержит только одну таблицу, нет необходимости перечислять имя таблицы в операторе DELETE.
Sub DeleteX() Dim dbs As Database, rst As Recordset ' Modify this line to include the path to Northwind ' on your computer. Set dbs = OpenDatabase("Northwind.mdb") ' Delete employee records where title is Trainee. dbs.Execute "DELETE * FROM " _ & "Employees WHERE Title = 'Trainee';" dbs.Close End Sub
SQL — запрос DELETE
Запрос DELETE используется для удаления существующих записей из таблицы.
Вы можете использовать запрос WHERE с DELETE, чтобы удалить выбранные строки, в противном случае все записи будут удалены.
Синтаксис:
Базовый синтаксис DELETE запроса с WHERE выглядит следующим образом:
DELETE FROM table_name WHERE [condition];
Вы можете объединить N число условий с помощью операторов AND или OR.
Пример:
Рассмотрим таблицу CUSTOMERS, имеющую следующие записи:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Maxim | 35 | Moscow | 21000.00 | | 2 | AndreyEx | 38 | Krasnodar | 55500.00 | | 3 | Oleg | 33 | Rostov | 34000.00 | | 4 | Masha | 35 | Moscow | 31500.00 | | 5 | Ruslan | 34 | Omsk | 43000.00 | | 6 | Dima | 32 | SP | 45000.00 | | 7 | Roma | 34 | SP | 10000.00 | +----+----------+-----+-----------+----------+
Ниже приведен пример, который бы удалил из таблицы CUSTOMERS строку, идентификатор равным 6:
SQL> DELETE FROM CUSTOMERS WHERE >
Теперь таблица CUSTOMERS будет иметь следующие записи:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Maxim | 35 | Moscow | 21000.00 | | 2 | AndreyEx | 38 | Krasnodar | 55500.00 | | 3 | Oleg | 33 | Rostov | 34000.00 | | 4 | Masha | 35 | Moscow | 31500.00 | | 5 | Ruslan | 34 | Omsk | 43000.00 | | 7 | Roma | 34 | SP | 10000.00 | +----+----------+-----+-----------+----------+
Если вы хотите УДАЛИТЬ все записи из таблицы CUSTOMERS, вам не нужно использовать WHERE и запрос DELETE будет выглядеть следующим образом:
SQL> DELETE FROM CUSTOMERS;
Теперь таблица КЛИЕНТОВ не будет иметь никаких записей.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
PHP + SQL. Как удалить запись из бд?
Есть простая база данных со словами. На странице есть форма: input-text «слово» и select «словарь». Нужно по нажатию на кнопку «удалить» произвести удаление набранного пользователем слова при условии, что пользователь выбрал словарь, в котором это слово есть.
Данные формы летят в php файл, где следующий код:
session_start(); require('../connection1.php'); header('Content-Type: text/html; charset=utf8'); if (isset($_POST['word']) && isset($_POST['vocabulary']))< $word = $_POST['word']; $vocabulary = $_POST['vocabulary']; $stmt = $connection->prepare("SELECT `id` FROM `words` WHERE `word` = ?"); $stmt->bind_param("i", $word); $stmt->execute(); $result1 = $stmt->get_result(); $row = mysqli_fetch_array($result1); $stmt = $connection->prepare("SELECT `id` FROM `words` WHERE `vocabulary` = ?"); $stmt->bind_param("i", $vocabulary); $stmt->execute(); $result2 = $stmt->get_result(); $id = mysqli_fetch_array($result2); if ($row === $id)< $query = "DELETE FROM `words` WHERE `words`.`id` = '$row'"; $result = mysqli_query($connection,$query) or die("Ошибка: ".mysqli_error($connection)); if($result)< $_SESSION['smsq'] = "Слово удалено!"; >else < $_SESSION['fsmsq'] = "Ошибка!"; >> else < $_SESSION['fsmsq'] = "Ошибка!"; >> header('Location: ../edit-voc.php')
Что исправить?)) Новичок + ничего не понимаю в stmt, сколько раз использовать и т.д. .
Или можно по-другому сделать?
- Вопрос задан более трёх лет назад
- 172 просмотра
Комментировать
Решения вопроса 1

Чебуратор тега РНР
Молодец, что используешь подготовленные выражения, но очень плохо, что не до конца. Подготовленные выражения должны использоваться для ВСЕХ запросов, в которых участвуют переменные.
Плюс использовать в запросе массив $row не имеет ни малейшего смысла.
Также я не уверен что word следует привязывать с типом i а не s
Ну и разумеется все это делается одним запросом.
if (isset($_POST['word'], $_POST['vocabulary']))< $word = $_POST['word']; $vocabulary = $_POST['vocabulary']; $query = "DELETE FROM `words` WHERE `word` =? and `vocabulary` = ?"; $stmt = $connection->prepare($query); $stmt->bind_param("ss", $word, $vocabulary); $stmt->execute(); if($stmt->affected_rows) < $_SESSION['smsq'] = "Слово удалено!"; >else < $_SESSION['fsmsq'] = "Ошибка!"; >> header('Location: ../edit-voc.php');
Отдельно замечу что никогда не надо писать or die(«Ошибка: «.mysqli_error($connection)); ю Вместо этого в файле с коннектом надо один раз написать
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
и тогда РНР обо всех ошибках запросов будет сообщать самостоятельно
Ответ написан более трёх лет назад
Нравится 1 6 комментариев
Александр Лебедев @alex2pac_vasiliev Автор вопроса
Почему-то вылезает ошибка:
Fatal error: Uncaught Error: Call to a member function bind_param() on null in D:\OSPanel\domains\test1\check\check-edit-voc.php:11 Stack trace: #0 thrown in D:\OSPanel\domains\test1\check\check-edit-voc.php on line 11
Лайн: $stmt->bind_param(«ss», $word, $vocabulary);
Все имена и таблицы прописаны верно, в поле «слово» ввожу существующее слово.. Словарь соотвественно выбираю тоже существующий
А почему нужно использовать «s», а не «i»? Мы же проверяем id слова и id словаря, если они совпадают, то удаляем. Можно использовать в query запрос ( . . . `word`.`id` = ? and `vocabulary`.`id` = ?)?

в файле с коннектом надо написать
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
Потом прочесть ошибку и исправить её

Мы же проверяем id слова
Это ты шутишь сейчас? Ты же сам писал:
Нужно по нажатию на кнопку «удалить» произвести удаление набранного пользователем слова
Где здесь «id слова»?
Александр Лебедев @alex2pac_vasiliev Автор вопроса

FanatPHP, Да, извиняюсь. Ерунду какую-то написал. Просто тестировал удаление на простенькой табличке:
Подумал, что надо id сравнивать XD
А по поводу ошибки, да. В connection сразу прописал ваш код, но выдает все равно Fatal error: Uncaught Error: Call to a member function bind_param() on null . В инете пишут, что скорее всего опечатки в переменных, хотя все верно.

я пропустил prepare
Александр Лебедев @alex2pac_vasiliev Автор вопроса
FanatPHP, большое спасибо, все работает корректно) Теперь понял, как работают подготовленные выражения
Ответы на вопрос 0
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- PHP
- +1 ещё
Как из разных word документов собрать все таблицы (средствами PHPOffice/PHPWord) с заданным названием и сохранить в один файл?
- 1 подписчик
- 40 минут назад
- 21 просмотр
Удаление данных средствами SQL, теория и практика
В данной статье будет рассмотрена методика удаления данных запросом в MSSQL-студии.
Отказ от ответственности
Проверяйте, пожалуйста, текст скрипта перед выполнением. Понимайте, что делаете. Помните, что ответственность лежит целиком на Вас!
С особой внимательностью рекомендую проверять скрипт перед выполнением, если в Вашей базе есть случаи, когда период записей регистров отличается от даты регистратора.
Основная цель применения
Прикладная задача, в процессе решения которой родилась данная методика: свертка базы (ввод остатков, удаление документов и движений регистров в прошлых периодах). То есть: удаление документов (вместе с табличными частями, разумеется) до определённой даты, и их движений. Иногда обработка использовалась для удаления данных с более сложными условиями, но они менялись вручную уже в SQL-студии.
Предыстория
Проблема: свертка стандартными средствами происходила неприлично долго. Точней, именно этап удаления старых данных. Остатки вводятся быстро, а вот удаление движений регистров, пометка на удаление документов, само удаление — по нашим оценкам на наших объёмах (500ГБ) заняло бы недели.
Решение: удалить данные средствами SQL, чтоб миновать механизмы платформы 1С, ненужные при данной операции, но отнимающие драгоценное (в рамках данной задачи) время.
Препятствия: Данные в SQL хранятся в разных таблицах. Таблиц много, как их связать — не всегда понятно. То есть мало очистить сам документ (шапку), надо очистить также данные табличных частей, и движений документа. Движения по разным регистрам. Для одного документа регистров может быть много. Каждый регистр в свою очередь хранит данные также в нескольких таблицах. Наименования таблиц — неосмысленные.
Теория
Варианты (операторы) удаления в SQL.
- DROP — полное удаление таблицы из структуры данных (вместе с данными). То есть очищаются не только данные, но и метаданные. Работает мгновенно.
- TRUNCATE — полная очистка таблицы с сохранением структуры таблицы (очищаются только строки таблицы, колонки остаются прежними). Работает мгновенно.
- DELETE — удаление записей в таблице по определенному условию. Занимает определенное время.
Оператором DROP на практике я почти не пользуюсь. TRUNCATE — иногда пригождается, когда по условию задачи возможно удалить всю таблицу (данные не нужны совсем, либо можно после удаления загрузить откуда-то только нужную часть). В остальных случаях (в том числе в рамках данной методики) используется DELETE.
Для того, чтоб удалить данные целостно по ряду связанных таблиц документа (шапка, ТЧ, движения) — сперва я рассматривал вариант честно отобрать данные документа по дате, а потом уже связать с другими таблицами через JOIN. То есть очистить поочередно все связанные таблицы, после чего удалить основную (так как только в ней есть реквизит, по которому решаем удалять объект или нет)
В итоге была выбрана и реализована следующая стратегия
- Удаляем движения регистров, которые двигает нужный вид документа, по связке с основной таблицей документа
- Удаляем строки табличных частей документа, по связке с основной таблицей документа
- Удаляем основную таблицу документа
- Очищаем целиком таблицы журналов, где участвует документ (нехорошо, но в нашем случае — не критично, можно и не трогать)
- Опционально можно очистить таблицы регистрации изменений для обмена
Таблиц много + названия неудобные + конструктора запросов нет = очень много рутины с высокой вероятностью ошибки и дороговизной ошибок. Поэтому был создан инструмент, берущий большую часть рутины на себя.
Устаревшая стратегия (альтернатива)
Первое решение, от которого я впоследствии отказался. Хотя вначале оно казалось более удобным и простым. А именно — очистить шапку. А потом все связанные таблицы поочередно, у кого нет «пары» в основной таблице (ссылка/регистратор = «битая» ссылка).
Данный вариант не работает для движений документа. Так как после удаления основной таблицы документа — IS NULL даёт истину после соединения таблицы движений регистра и основной таблицы документа в 2х случаях
- Когда действительно записи сделаны этим видом документа, и эти документы были удалены (тут всё хорошо)
- Когда записи были сделаны документами других видов, и в этом случае записи удаляются ошибочно (так нельзя!). Чтоб решить эту проблему надо связывать таблицу регистра со всеми возможными типами регистраторов, а это слишком сложно
Вобщем порядок был такой (отличия в пунктах 2 и 3)
- Удаляем записи регистров, которые двигает нужный вид документа, по связке с основной таблицей документа
- Удаляем основную таблицу документа
- Удаляем записи табличных частей документа, у которых Ссылка после соединения = IS NULL
- Остальное (как в основном варианте, журналы и регистрация изменений)
Но в процессе эксплуатации выяснилось, что удаление по пустой шапке на больших объёмах работает медленно, поэтому по умолчанию от данной стратегии пришлось отказаться (по крайней мере, на нашем примере), но эта опция по-прежнему доступна по соответствующей галочке на первой закладке.
Особенности
- Доступна опция порционного удаления.
- На данный момент, обработка существует только для обычного приложения.
- Обработка сама не подключается в SQL и не запускает скрипт там на выполнение. Только формирует текст скрипта. Считаю, что скопировать-вставить нетрудно, а если нет навыков работы в SQL-студии, то и запускать подобное, возможно, рано.
- Исходный код открыт.
Порядок действий
- Делаем архив
- Составляем список удаляемых данных (самые большие таблицы, которые удалить стандартными средствами слишком долго / неудобно / не хочется разбираться с тем, что удаляемые данные зарегистрируются к обмену и «пойдут» куда не надо)
- Запускаем обработку, при желании сверху ставим отбор
- Выделяем в списке нужные виды документов (обязательно выделяем ОСНОВНЫЕ таблицы, то есть таблицы шапок, а не табличных частей)
Можно сразу несколько с Ctrl-ом (доступно множественное выделение) - Переходим на вторую закладку и выбираем нужный нам вариант удаления (например по дате)
- Нажимаем соответствующую кнопку по формированию скрипта
- Получаем в окне сообщений готовый скрипт на удаление данных на языке SQL
- Копируем в буфер, вставляем в SQL Management Studio
- При надобности корректируем. Например через замену (Ctrl+H) можно заменить «=», и получится скрипт удаляющий данные документов не до указанной даты, а, наоборот, — начиная с неё. Либо отбор по дате можно заменить на пометку документа на удаления (_Marked = 1). Либо чтоб удалялись только непроведенные (_Posted = 0).
- Запускаем на выполнение, дожидаемся завершения, наблюдаем за статусом на закладке Messages
- Проверяем результат в 1С
- Обязательно пересчитываем итоги затронутых регистров накопления и бухгалтерии, так как таблицы итогов не обрабатываются
При желании протестировать/посмотреть «что именно будет удаляться» предусмотрена соответствующая опция (галочка справа внизу), в этом случае скрипты будут формироваться с оператором SELECT, а не DELETE. Можно выделить нужный кусок, запустить на исполнение, посмотреть результаты, прежде чем запускать на удаление.
Для PostgreSQL
. Использовалась копированием текста скрипта из 1С, вставкой и запуском в dbAdmin через Query Tool
Версия для PostgreSQL на данный момент не поддерживает порционное удаление
Вместо эпилога
Конструктивную критику, вопросы и пожелания — прошу в комментарии!









