Используя insert в database.table1, выберите * из таблицы 2, где id = some_value; - PullRequest
2 голосов
/ 21 марта 2009

Я хочу скопировать строку из таблицы в базе данных в идентичную таблицу в другой базе данных. Для тестирования я создал это:

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

и таблица 'stuff' такие же, как указано выше в двух базах данных, testdb1 и testdb2. Затем я помещаю две строки в 'stuff' в 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, я получу:

SQL error: PRIMARY KEY must be unique

Я хотел бы, чтобы при копировании строки автоматически выбирался новый уникальный абсид в случае конфликта. Есть ли способ, которым я могу указать это с более сложной select * ... выше?

Полагаю, я могу обойти это, создав еще одну БД (скажем, в памяти) с идентичной таблицей, но без ограничения первичного ключа, и сделав копию за два шага (установив для absid значение null между), но Я бы предпочел более разумный способ, если он существует.

Ответы [ 2 ]

2 голосов
/ 21 марта 2009

Вы можете указать столбцы, опуская столбец первичного ключа, и новая вставленная строка активирует автоматическую генерацию ключа. Например, если первичный ключ находится в столбце col1, а столбцы col2 - col4 являются неключевыми столбцами, попробуйте следующее:

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

К сожалению, это означает, что вы не можете использовать подстановочный знак "*". В SQL нет способа использовать подстановочный знак для обозначения «все столбцы, кроме указанных мной».

0 голосов
/ 04 апреля 2009

В конце концов я создал базу данных в памяти с той же таблицей, за исключением того, что не указал «первичный ключ». Я сделал первую «вставку в mytable select * from ...» в базу данных в памяти, затем установил absid на ноль, а затем вторую «вставку в ...» в целевую базу данных. Таким образом, я скопировал строку с новым значением ключа.

Несмотря на то, что есть второй шаг, все это действие (в моем приложении) не выполняется с огромным количеством строк, поэтому эффективность становится вторичной по отношению к удобству обслуживания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...