Инструкция ATTACH DATABASE добавляет другой файл базы данных к текущему соединению с базой данных. Файлы баз данных, которые были присоединены ранее, могут быть удалены с помощью команды DETACH DATABASE.
2. Подробности
Имя файла базы данных, подлежащей подключению, — это значение выражения, которое встречается перед ключевым словом AS. Имя файла базы данных следует той же семантике, что и аргумент имени файла для sqlite3_open() и sqlite3_open_v2(); специальное имя ":memory:" приводит к базе данных в памяти, а пустая строка — к новой временной базе данных. Аргумент имени файла может быть URI-именем файла, если обработка URI-имен файлов включена в подключении к базе данных. По умолчанию URI-имена файлов отключены, однако это может измениться в будущей версии SQLite, поэтому разработчики приложений должны планировать соответствующим образом.
Имя, которое встречается после ключевого слова AS, — это имя базы данных, используемой внутри SQLite. Имена схем 'main' и 'temp' относятся к основной базе данных и базе данных, используемой для временных таблиц. К основным и временным базам данных нельзя подключаться или отключаться.
К таблицам в подключённой базе данных можно обращаться, используя синтаксис имя_схемы.имя_таблицы. Если имя таблицы уникально во всех подключённых базах данных и в основных и временных базах данных, то префикс имя_схемы не требуется. Если две или более таблицы в разных базах данных имеют одинаковое имя, и префикс имя_схемы не используется при ссылке на таблицу, то выбирается таблица из базы данных, которая была подключена последней.
Транзакции, вовлеченные в несколько подключённых баз данных, являются атомарными, при условии, что главная база данных не ":memory:" и режим журнала journal_mode не WAL. Если основная база данных — ":memory:" или если режим журнала — WAL, то транзакции по-прежнему атомарны в каждом отдельном файле базы данных. Но если компьютер-хост выйдет из строя в середине COMMIT, где обновляются два или более файлов базы данных, то некоторые из этих файлов могут получить изменения, а другие — нет.
Существует ограничение, задаваемое с помощью sqlite3_limit() и SQLITE_LIMIT_ATTACHED, на количество баз данных, которые могут быть одновременно подключены к одному подключению к базе данных.