我想将数据库中的表中的行复制到另一个数据库中的相同表中。出于测试目的,我创建了这个:
CREATE TABLE stuff (absid integer primary key, otherfield string );
和表格'stuff'
如上所述,位于两个数据库testdb1
和testdb2
中。然后我在'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)来解决这个问题,但是我如果存在,我更喜欢更聪明的方式。
答案 0 :(得分:2)
您可以指定列,省略主键列,插入的新行将激活自动密钥生成。例如,假设主键位于列col1
中,列col2
到col4
是非键列,请尝试以下操作:
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。这样我就可以复制行并使用新的键值。
虽然还有第二步,但是整个操作(在我的应用程序中)并没有使用大量的行,因此效率变得不可维护。