Страница 1 из 2

Копирование таблицы SQLite

Добавлено: 12 Март 2021, 9:05
Игорь Столяров
Привет всем !

Помогите пожалуйста начинающему программисту SQL !
Как сделать полную копию таблицы ? Вроде бы:

Код: Выделить всё

CREATE TABLE TableNew As Select * FROM TableOld;
Всё прекрасно получается ... но без индексов и как следствие добавление записей не работает.
Как добавить копирование PRIMARY KEY ? Или создание PRIMARY KEY(RecID) ... :(

Копирование таблицы SQLite

Добавлено: 12 Март 2021, 11:21
finsoftrz
Игорь, эти вопросы проще погуглить. Например, по словам sqlite clone table.

Копирование таблицы SQLite

Добавлено: 12 Март 2021, 11:51
Игорь Столяров
Гуглил есстестно ... :(
Там либо какой-то бред, либо заумные рассуждения о работе из командной строки.
Ну и бесконечный копипаст одного и того же. А CLONE - это вообще про БД, а не таблицу.
Думал, может у нас на форуме есть реально работающие с SQL ...

Копирование таблицы SQLite

Добавлено: 12 Март 2021, 12:33
ingasoftplus
I suspect you're missing the difference between CREATE TABLE and CREATE TABLE AS (otherwise known as CTAS).

CREATE TABLE AS allows you to create a table from the resultset of a query.

For example:

Код: Выделить всё

CREATE TABLE PHILSUCKS AS ( SELECT PHIL, SUCKS FROM EGGS );
You could, instead of using CTAS, use a "normal" CREATE TABLE statement, then INSERT the rows manually. This allows you to specify the PRIMARY KEY and any constraints. eg:

Код: Выделить всё

CREATE TABLE PHILSUCKS
(
  PHIL   INTEGER PRIMARY KEY,
  SUCKS  INTEGER NOT NULL
);

INSERT INTO PHILSUCKS ( SELECT PHIL, SUCKS FROM EGGS );
Obviously, you can also create indexes etc too:

Код: Выделить всё

CREATE INDEX EGGSUCKING ON PHILSUCKS (SUCKS);

Копирование таблицы SQLite

Добавлено: 12 Март 2021, 13:27
Игорь Столяров
ingasoftplus писал(а): 12 Март 2021, 12:33 use a "normal" CREATE TABLE statement, then INSERT the rows manually
I decided the question a long time ago. But this is a slow solution. :(

Копирование таблицы SQLite

Добавлено: 12 Март 2021, 13:51
finsoftrz
Игорь Столяров писал(а): 12 Март 2021, 11:51 Гуглил есстестно ... :(
Там либо какой-то бред, либо заумные рассуждения о работе из командной строки.
Ну и бесконечный копипаст одного и того же. А CLONE - это вообще про БД, а не таблицу.
Думал, может у нас на форуме есть реально работающие с SQL ...
Гуглы разные, я перед ответом на всякий случай проверил, народ обсуждал, надо только подальше почитать. Про реально работающих было бесподобно, спасибо. :facepalm:

Копирование таблицы SQLite

Добавлено: 12 Март 2021, 15:07
Игорь Столяров
Я только учусь работать с SQL и не знаю как сделать полноценную копию таблицы одной командой.
Интернет читал какой есть, но не нашёл реального решения.
Сделал по книжке через создание новой таблицы и тупо перелил записи. :(

Если Вы знаете SQL и понимаете смысл вопроса - помогите пожалуйста его решить. :)
Если нет - ну буду сам искать, читать дальше интернет и т.д.

Копирование таблицы SQLite

Добавлено: 12 Март 2021, 15:42
gopstop2007

Код: Выделить всё

sqlite> .output c:/sqlite/albums.sql
! указываем в какой файл сохранить

sqlite> .dump albums
!указываем какую таблицу, если не указывать, сохраняет всю базу

sqlite> .quit

Копирование таблицы SQLite

Добавлено: 12 Март 2021, 16:06
Игорь Столяров
Игорь Столяров писал(а): 12 Март 2021, 11:51 Там либо какой-то бред, либо заумные рассуждения о работе из командной строки.
Приятно цитировать самого себя. Хоть кто-то читает перед тем как написать. Но всё равно спасибо ! ;)

Копирование таблицы SQLite

Добавлено: 12 Март 2021, 16:33
finsoftrz
Я так понял, что штатно нельзя. Можно получить описание таблицы из метаданных, и по нему сгенерить описание новой таблицы. Но это надо пробовать, мне такое не нужно.

Копирование таблицы SQLite

Добавлено: 12 Март 2021, 16:48
Игорь Столяров
Спасибо ... Я пришёл к такому же результату. :(
В SQL всё хорошо, пока ты идёшь по общей колее, но шаг в сторону и вырастают какие-то циклопические проблемы ! :(

Копирование таблицы SQLite

Добавлено: 12 Март 2021, 17:22
finsoftrz
Тут обычно стандартный ответ, наверно Вы тащите подходы из проектов с isam. :)

Копирование таблицы SQLite

Добавлено: 12 Март 2021, 17:56
gopstop2007

Код: Выделить всё

DATA
AA CSTRING(4096)
BB CSTRING(4096)
CODE

! получаем схему таблицы
sqldumy{PROP:SQL} = 'SELECT sql FROM sqlite_master WHERE type=`table` AND name=`mytable`'
Next(sqldumy)
AA = sqldumy.field

! получаем индексы -index
sqldumy{PROP:SQL} = 'SELECT sql FROM sqlite_master WHERE type=`index` AND tbl_name=`mytable`'
Next(sqldumy)
BB = sqldumy.field

! найти в строке AA 'mytable' заменить на  'mytable1', выполняем создание таблицы с новым названием
sql{PROP:SQL} = AA

! копируем данные
INSERT INTO mytable1 AS SELECT * FROM mytable


Копирование таблицы SQLite

Добавлено: 13 Март 2021, 11:48
PavelNK
Игорь Столяров писал(а): 12 Март 2021, 15:07 Я только учусь работать с SQL и не знаю как сделать полноценную копию таблицы одной командой.
Интернет читал какой есть, но не нашёл реального решения.
Сделал по книжке через создание новой таблицы и тупо перелил записи. :(

Если Вы знаете SQL и понимаете смысл вопроса - помогите пожалуйста его решить. :)
Если нет - ну буду сам искать, читать дальше интернет и т.д.
Я не работаю с SQLLite, в основном работаю с MSSQL и подобными.
Если нужно получить абсолютную копию таблицы вместе со всеми индексами и т.д. и т.п., то нужно создать эту таблицу скриптом, а потом скопировать данные. Если описания нет, то можно получить его из системных таблиц, содержащих описание всех объектов БД.
Думаю, что в SQLLite аналогично.

Копирование таблицы SQLite

Добавлено: 13 Март 2021, 13:19
Игорь Столяров
Спасибо ! Как много нужно всего знать в каждом направлении, что бы делать софт ... Блин ! :)