Подтвердить что ты не робот

Скопируйте структуру таблицы в новую таблицу в sqlite3

Есть ли простой способ скопировать существующую структуру таблицы в новую? (не нужны данные, только структура → как id INTEGER, имя varchar (20)...)

спасибо

4b9b3361

Ответ 1

Вы можете использовать такую ​​команду:

CREATE TABLE copied AS SELECT * FROM mytable WHERE 0

но из-за динамической типизации SQLite большая часть информации о типе будет потеряна.

Если вам нужна только таблица, которая ведет себя как оригинал, т.е. имеет одинаковое число и имена столбцов и может хранить одни и те же значения, этого достаточно.

Если вам действительно нужна информация типа точно так же, как оригинал, вы можете прочитать исходный оператор SQL CREATE TABLE из таблицы sqlite_master, например:

SELECT sql FROM sqlite_master WHERE type='table' AND name='mytable'

Ответ 2

SQLite не может клонировать таблицу с PK, значениями по умолчанию и индексами.

Требуется взлом с помощью другого инструмента.

В оболочке замените имя таблицы на sed.

sqlite3 dbfile '.schema oldtable' | sed '1s/oldtable/newtable/' | sqlite3 dbfile

И вы можете проверить новую таблицу.

sqlite3 dbfile '.schema newtable'

Первичный ключ, значения по умолчанию и индексы будут зарезервированы.

Я надеюсь, что эта команда может вам помочь.

Ответ 3

Я бы предпочел:

> sqlite3 <db_file>

sqlite3 > .output <output_file>
sqlite3 > .dump <table_name>

В приведенной выше строке создается дамп таблицы, включающий инструкции DDL и DML.

Внести изменения в этот файл, т.е. найти и заменить имя таблицы новым именем таблицы

Кроме того, замените "CREATE TRIGGER " на "CREATE TRIGGER <NEWTABLE>_", это заменит существующие триггеры именами триггеров с новым именем таблицы на нем. Это сделает его уникальным и не вызовет конфликтов с существующими триггерами. После того, как все изменения схемы будут реализованы, прочитайте его обратно в базу данных, используя .read

sqlite3 > .read output_file

Это может быть сценарий в файле оболочки с использованием команд оболочки, например:

echo ".dump <table>" | sqlite3 <db_file> > <table_file>
sed -i.bak "s/\b<table_name>\b/<new_table_name>/g" <table_file>
sed -i.bak "s/\bCREATE TRIGGER \b/CREATE TRIGGER <new_table_name_>/g" <table_file>
echo ".read <table_file>" | sqlite3 <db_file>
rm <table_name>.bak 

Например:

Если у вас есть таблица T, а новая таблица - TClone в файле db D с файлом F, который будет создан: then

echo ".dump T" | sqlite3 D.sqlite > F
sed -i.bak "s/\bT\b/TClone/g" F
sed -i.bak "s/\bCREATE TRIGGER \b/CREATE TRIGGER TClone_>/g" F
echo ".read F" | sqlite3 D.sqlite 
rm T.bak

Наконец, вы можете обобщить этот script, создав параметризованную версию, в которой вы можете передать source_table, destination_table, db_file в качестве параметров, которые можно использовать для клонирования любой таблицы.

Я тестировал это, и он работает.

Тестирование:

sqlite3 <database_file>
sqlite3 > select * from <new_table>;

должен давать вам те же результаты, что и исходная таблица. и

sqlite3 > .schema <new_table>

должна иметь такую ​​же схему, что и исходная таблица с новым именем.