SQL-Ex blog
В рамках интерактивного (чистого) SQL избежать возникновения ошибки в этом случае не получалось. Однако проблема легко решается процедурно (T-SQL):
Встроенная функция object_id возвращает идентификатор объекта, заданного именем, или же NULL, если такого имени не существует.
И вот в SQL Server 2017 появился оператор DROP TABLE IF EXISTS, который не вызывает ошибки, если удаляемой таблицы не существует, например:
Теперь предположим, что нам нужно удалить связанные таблицы. Рассмотрим следующий пример:
| id |
|---|
| 1 |
| 2 |
| 3 |
| id | t1_id |
|---|---|
| 1 | 1 |
| 2 | 2 |
Стандартное каскадное удаление
работать не будет, т.к. оно еще не реализовано в SQL Server (но работает, например, в PostgreSQL), тогда как оператор
вызовет следующую ошибку:
Невозможно удалить объект «t1», так как на него ссылается ограничение FOREIGN KEY.
Мы можем удалить связанные таблицы одним оператором, перечислив их через запятую (сначала подчиненную таблицу, а затем — главную):
Если указать таблицы в неправильном порядке, т.е. t1, t2, то при удалении t1 будет получена вышеприведенная ошибка, а потом будет удалена t2.
Если среди перечисленных таблиц (не обязательно две) могут быть отсутствующие, то тогда поможет новый оператор:
Заметим, что оператор DROP . IF EXISTS может применяться и к другим объектам базы данных, например, представлениям и хранимым процедурам.
Возможно, что в следующих версиях SQL Server может появиться и оператор типа:
который будет создавать таблицу только в том случае, если такой не существует.
Обзор Navicat Premium — повелитель баз данных
Одна из самых необходимых вещей в ассортименте любого программиста это хорошая программа-GUI для работы с базами данных, причём, желательно, кросс-платформенная и «понимающая» разные СУБД. Конечно, есть гении, способные всё сделать через SQL (ну или, скажем, JS) команды в консоли, но для большинства людей удобный графический интерфейс даёт возможность работать быстрее. Об одном из лучших таких решений, существующих для macOS, мы и поговорим.

- MySQL
- MariaDB
- PostgreSQL
- Oracle
- SQLite
- SQL Server
- MongoDB

Так же поддерживаются все популярные облачные сервисы:
- AmazonAWS
- Google Cloud
- Oracle Cloud
- Microsoft Azure
- MongoDB Atlas
- Alibaba Cloud
- Huawei Cloud
Конечно, вряд ли кто-то будет работать со всем этим одновременно, но готовым стоит быть ко всему.

Интерфейс программы достаточно привычен. Вверху находится панель с кнопками, отвечающими за основные функции, снизу — строка состояния. Основная часть окна тоже знакома любому, кто использовал подобные инструменты. Слева размещено дерево объектов тех БД, к которым вы подключены. В центре — рабочая область, отображающая текущую информацию, для удобства тут вы можете открывать дополнительные вкладки. Справа отображается панель с детальной информацией, но она далеко не всегда полезна, поэтому её можно скрыть, освободив себе побольше рабочего пространства.

В ходе любой манипуляции вы можете посмотреть, как ваши действия «переводятся» в SQL, это поможет быстрее выучить некоторые редкоиспользуемые возможности языка, да и просто пригодится для проверки «что я там наклацал».

Программа предлагает гибкие инструменты для работы с данными начиная, конечно, с просмотра содержимого таблиц с возможностями вроде фильтрации и сортировки. Navicat даже понимает внешние ключи, позволяя выбирать значения соответствующих атрибутов кортежа с помощью удобного диалога. Так же в наличии гибкие возможности импорта/экспорта в популярные форматы, начиная с исторических DBF и CSV, и заканчивая современным JSON.


- Enterprise (все описанные выше возможности только для одной БД) по цене в 300 долларов
- Standard (без расширенных опций экспорта/импорта, синхронизации и т.п.) ценой в 200 долларов
- Essentials (инструменты для простой разработки БД без автоматизации, синхронизации и т.п.) за 70 долларов
Так же для этих отдельных версий существует вариант для некоммерческого использования, стоящий 120 долларов.


Название: Navicat Premium
Издатель/разработчик: PremiumSoft CyberTech Ltd
Цена: от 70$
Встроенные покупки: Нет
Совместимость: macOS
Ссылка: Установить
Как игнорировать ошибку при попытке удалить несуществующие таблицы с помощью RODBC?
У меня есть функция, которая отлавливает ошибки, возникающие из-за odbcQuery . Как сделать так, чтобы попытка удалить несуществующие таблицы не вызывала ошибку?
Что ваш код делает сейчас, что не работает для вас? Вам нужно пропустить строку DROP TABLE внутри сценарий? Или ошибка вообще не возникает?
Я хотел бы, чтобы это не было ошибкой при удалении таблицы, так как отсутствие удаления таблицы может помешать созданию новой версии указанной таблицы.
@OldProgrammer спасибо, но я бы хотел, чтобы исправление было в коде R, поскольку я использую его в качестве инструмента отладки для автоматического обновления таблиц через сервер R.