2009-03-21 6 views
2

Je souhaite copier une ligne d'une table dans une base de données vers une table identique dans une autre base de données. Pour des fins de test, j'ai créé ceci:En utilisant insert dans database.table1, sélectionnez * from table2 où id = some_value;

CREATE TABLE stuff (absid integer primary key, otherfield string); 

et une table 'stuff' est comme ci-dessus dans deux bases de données, et testdb1testdb2. Ensuite, j'ai mis deux lignes dans 'stuff' dans testdb1. A partir d'une ligne de commande, je peux alors copier une ligne d'un db à l'autre, ainsi:

prompt> sqlite3 testdb1 

sqlite> attach database testdb2 as testdb2; 

sqlite> insert into testdb2.stuff select * from stuff where absid=2; 

sqlite> ^d 

prompt> 

Jusqu'à présent, si bon. MAIS: il est tout à fait possible dans l'application où je veux réellement faire cela pour de vrai, qu'il y aura des clashes clés. Par exemple, si j'utilise la séquence ci-dessus pour copier la ligne de retour à testdb1, je reçois:

SQL error: PRIMARY KEY must be unique 

Ce que je voudrais arriver est que lorsque la ligne est copiée, on choisit une nouvelle absid unique, automatiquement si est un conflit. Est-il possible de spécifier ceci avec un select * ... plus complexe ci-dessus? Je suppose que je peux contourner cela en créant un autre db (en mémoire, disons) avec la table identique mais sans la contrainte de clé primaire, et en faisant la copie en deux étapes (en définissant absid à null entre), mais je Je préférerais un moyen plus intelligent s'il en existe un.

Répondre

0

En fin de compte j'ai fait une base de données en mémoire, avec la même table excepté en laissant "clé primaire". J'ai fait un premier "insert into mytable sélectionner * from ..." dans la base de données en mémoire, puis mettre absid à null, puis un second "insert into ..." dans la cible db. De cette façon, j'ai copié la ligne et ajouté une nouvelle valeur de clé.

Bien qu'il y ait une deuxième étape, cette action complète (dans mon application) ne se fait pas avec un grand nombre de lignes, donc l'efficacité devient secondaire à la maintenabilité.

2

Vous pouvez spécifier les colonnes en omettant la colonne de clé primaire et la nouvelle ligne insérée activera la génération automatique de clé. Par exemple, en supposant que la clé primaire est dans la colonne col1 et colonnes col2 par col4 sont des colonnes non-clés, essayez ceci:

sqlite> insert into testdb2.stuff (col2, col2, col4) 
    select col2, col3, col4 from stuff where absid=2; 

Malheureusement, cela signifie que vous ne pouvez pas utiliser le « * » joker. Il n'y a aucun moyen en SQL d'utiliser un caractère générique pour signifier "toutes les colonnes sauf celles que je spécifie".

Questions connexes