2013-05-29 5 views
5

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

Проблема заключается в том, что после утверждения еще 5 тысяч строк будут перенесены в основную таблицу + еще 3-5 строк для каждой строки в таблице подробностей (хранит данные). Моя текущая реализация как этот

//Get the rows from temporary table (batch_temp) 
    //Loop through the data 
     //Insert the data to the main table (batch_main) and return the id 
     //Get the details row from the temporary detail table (batch_temp_detail) using detail_tempid 
      //Loop through the data 
       //Insert the details to the detail table (batch_main_detail) with the main table id amount_id 
      //End Loop 
    //End Loop 

Но эта реализация будет принимать по крайней мере 20k запросов. Есть ли какие-то лучшие способы реализовать то же самое.

Я попытался создать sqlfiddle, но не смог его создать. Поэтому я вставил запрос в pgsql.privatepaste.com

+0

Вы пробовали выбрать? – Robert

+0

Я не пробовал 'SELECT INTO', но я прочитал документы. Из этого я понял, что «SELECT INTO» вернет пустоту. Но мне нужно amount_id из batch_main, чтобы вставить соответствующие данные в batch_main_detail. –

+0

У вас есть поле, которое позволяет вам маркировать отношение записей из временной таблицы и основной таблицы? Если у вас есть, я думаю, вы можете выполнить свою задачу с помощью двух запросов, покажите мне свои структуры таблиц. – Tarzan

ответ

2

Я сожалею, что я не знаком с PostgreSQL. Мое решение в MySQL, я надеюсь, что это может помочь, если они (MySQL & PostgreSQL) одинаковы.

Во-первых, мы должны добавить еще 1 поле в таблицу batch_main чтобы отслеживать происхождение batch_temp запись для каждого batch_main записи.

ALTER TABLE `batch_main` 
    ADD COLUMN tempid bigint; 

Затем на утверждение, мы будем вставлять 5k строк по 1 запросу:

INSERT INTO batch_main 
    (batchid, userid, amount, tempid) 
    SELECT batchid, userid, amount, amount_id FROM batch_temp; 

Таким образом, с каждой новой batch_main записи мы имеем идентификатор своего происхождения batch_temp записи, то. Затем вставьте подробные данные

INSERT INTO `batch_main_detail` 
    (detail_amount, detail_mainid) 
    SELECT 
     btd.detail_amount, bm.amount_id 
     FROM 
      batch_temp_detail `btd` 
      INNER JOIN batch_main `bm` ON btd.detail_tempid = bm.tempid 

Done!

P/S: Я запутать немного о том, как вы называете ваши поля, и так как я не знаю, о PostgreSQL и глядя в свой синтаксис, вы можете использовать ту же последовательность для первичного ключа таблицы как batch_temp & batch_main? Если вы можете, нет необходимости добавлять еще одно поле.

Надеюсь, что эта помощь,

+0

спасибо, человек ..., который отлично работал –

0

Просто обновите свою схему. Вместо двух таблиц: один main и один temporary, вы должны иметь все данные в основной таблице, но иметь флаг, который указывает, утвержден ли определенная запись или нет. Первоначально он будет установлен на false, и после его утверждения будет просто установлено значение true, а затем данные могут отображаться на вашем веб-сайте и т. Д. Таким образом вам не нужно будет write данных два раза или даже придется перенести его с одного таблица на другие

+0

Фактически таблица, которую я дал, является только структурой выборки, обе таблицы содержат несколько полей. –

+0

Также есть некоторые сложности в расчетах. Некоторые из временных рядов не будут скопированы в основную таблицу ... их нужно добавить в другую таблицу. –

0

вы не указали RDBMS вы используете, но старую добрую топка с SELECT, в нем должно сделать трюк в одной команде:

insert main (field1,...,fieldN) select field1,...,fieldN from temporary 
Смежные вопросы