使用insert into database.table1 select * from table2 where id = some_value;

时间:2009-03-21 20:49:15

标签: sqlite

我想将数据库中的表中的行复制到另一个数据库中的相同表中。出于测试目的,我创建了这个:

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

和表格'stuff'如上所述,位于两个数据库testdb1testdb2中。然后我在'stuff'的{​​{1}}中放了两行。从命令行,我可以将一行从一个db复制到另一个db,因此:

testdb1

到目前为止一切顺利。但是:在应用程序中,我真的想要真正做到这一点,很可能会发生关键冲突。例如,如果我使用上面的序列将行复制回prompt> sqlite3 testdb1 sqlite> attach database testdb2 as testdb2; sqlite> insert into testdb2.stuff select * from stuff where absid=2; sqlite> ^d prompt> ,我得到:

testdb1

我想要发生的是,当复制行时,如果存在冲突,则会自动选择新的唯一absid。有没有办法可以用更复杂的SQL error: PRIMARY KEY must be unique 来指定它?

我想我可以通过使用相同的表创建另一个db(在内存中,但是没有主键约束),并分两步执行复制(在两者之间将absid设置为null)来解决这个问题,但是我如果存在,我更喜欢更聪明的方式。

2 个答案:

答案 0 :(得分:2)

您可以指定列,省略主键列,插入的新行将激活自动密钥生成。例如,假设主键位于列col1中,列col2col4是非键列,请尝试以下操作:

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

不幸的是,这意味着您无法使用“*”通配符。在SQL中,没有办法使用通配符来表示“除了我指定的列之外的所有列。”

答案 1 :(得分:0)

最后我创建了一个内存数据库,除了不使用“主键”外,使用相同的表。我做了第一个“插入mytable select * from ...”进入内存数据库,然后将absid设置为null,然后将第二个“insert into ...”放入目标db。这样我就可以复制行并使用新的键值。

虽然还有第二步,但是整个操作(在我的应用程序中)并没有使用大量的行,因此效率变得不可维护。