On 2015-10-06 04:52 PM, H?ctor Fiandor wrote:
> Dear fellows:
>
>   
>
> I handle my applictions with Lazarus and use BD as sqlite. Sometimes I have
> to obtain a copy of an sqlite table and now I use the method of read and
> write, but I want to know if exists and SQL command that do the same with
> less efforts.

Hi H?ctor,

Copying a table via SQL is rather easy with respect to the data... but 
tables may have Indices, Constraints and Triggers that were added after 
creation or depend on other tables. Tables might also have an 
Auto-Increment value set on a primary key and kept in another table 
(sqlite_sequence), etc.

If your table has no Auto-increment explicitly defined, and no external 
or table-dependent constraints, then the following SQL will happily 
produce a copy of the basic table layout and its contents:
CREATE TABLE newTableName AS SELECT * FROM oldTableName;

If you fancy keeping the original Schema, then an extra step is needed, 
which entail reading the old SQL, replacing the table name and then 
applying it and copying data, which in some pseudo-code might look like 
this:

Open DB;
$SQL = ReadFromSQLite(" SELECT sql FROM sqlite_master WHERE type='table' 
AND name='oldTableName'; ");
replace($SQL, "CREATE TABLE oldTableName", "CREATE TABLE newTableName"); 
// Beware the old name might be enclosed in quotes or such.
if sqlite-execute($SQL) then
     sqlite_execute(" INSERT INTO newTableName SELECT * FROM 
oldTableName; ");

Note that it is better to determine the fields returned by a "SELECT *" 
statement and using that string rather than the "*" because technically, 
there is no guarantee that the order of fields returned by * will be the 
same as it was defined in the table. (It mostly /is/ courtesy of 
convention, but it is not guaranteed behaviour).

You can expand the above code to check and add external constraints, 
indices and triggers. Use pragma foreign_keys = OFF; at the start where 
you are duplicating tables with foreign key constraints.

If you are copying a table to a different DB, then the name need not be 
replaced (obviously).

The SQLite CLI can dump an entire database to SQL if you fancy copying 
the DB in total.

Hope some of this helped,
Cheers!
Ryan

Reply via email to