Можно ли разбить оператор INSERT на несколько без повторной вставки строк? - PullRequest
2 голосов
/ 25 марта 2011

У меня есть такой оператор INSERT:

   mtemp = "station, calendar, type, name, date, time"
   query = "INSERT INTO table (%s) VALUES ( '%s', '%s', '%s', %s, '%s', '%s' );" 
   query = query % (mtemp, mstation, mcalendar, mtype, mname, mdate, mtime)
   curs.execute(query, )
   conn.commit()

Проблема в том, что я не могу получить переменные: mcalendar, mdate, mtime в этом выражении. Они не являются постоянными значениями. Я должен был бы получить доступ к каждому из них в замкнутом круге. Однако значения mstation, mtype и mname являются фиксированными. Я попытался разделить оператор INSERT на несколько: по одной для каждой из трех переменных в цикле forloop, и по одному для трех фиксированных значений в одном цикле forloop. Forloop в основном, чтобы определить, когда вставлять строки. У меня есть список row1 и список row2, row1 - это полный список записей, в то время как rows отсутствуют некоторые из них. Я проверяю, существует ли запись row2 в row1. Если это так, то выполнить инструкцию INSERT, если нет, ничего не делать.

Я запустил коды и обнаружил две проблемы:

  1. Он вставляет больше строк, чем нужно. Предполагается вставить не более 240 строк, поскольку для каждого датчика в каждом дне есть только 240 временных событий. (Интересно, потому что я написал слишком много forloop, чтобы он продолжал вставлять строки). Теперь он получает более 400 новых строк.
  2. В этих новых строках, вставляемых в таблицу, они имеют значения только в столбцах с фиксированным значением. Для трех из них, которые я использую один forloop для вставки данных, они вообще не имеют значения.

Надеюсь, кто-нибудь подскажет мне здесь. Заранее спасибо! Я могу поставить больше кодов здесь, если это необходимо. Я даже не уверен, что я на правильном пути.

Ответы [ 3 ]

1 голос
/ 25 марта 2011

Один оператор INSERT всегда соответствует одной новой строке в таблице.(Если, конечно, во время вставки возникает ошибка.) Вы можете ВСТАВИТЬ строку, а затем ОБНОВИТЬ ее позже, чтобы добавить / изменить информацию, но нет такой вещи, как разделение ВСТАВКИ.запрос, который необходимо выполнить несколько раз с изменением данных, лучший вариант - подготовленный оператор .Подготовленный оператор «компилирует» SQL-запрос, но оставляет заполнители, которые могут устанавливаться при каждом его выполнении.Это повышает производительность, потому что оператор не нужно анализировать каждый раз.Вы не указали, какую библиотеку вы используете для подключения к postgres, поэтому я не знаю, какой будет синтаксис, но есть что посмотреть.

Если вы не можете / не хотитеЕсли вы хотите использовать подготовленные операторы, вам нужно будет просто создать строку запроса для каждой вставки.Не подставляйте значения перед циклом, подождите, пока вы не узнаете их все, прежде чем создавать запрос.

1 голос
/ 25 марта 2011

Я не уверен, что точно понимаю ваш сценарий, но это то, что вам нужно?

Псевдокод

mstation = "foo"
mtype = "bar"
mname = "baz"
mtemp = "station, calendar, type, name, date, time"
queryTemplate = "INSERT INTO table (%s) VALUES ( '%s', '%s', '%s', %s, '%s', '%s' );" 
foreach (mcalendar in calendars) 
    foreach (mdate in dates) 
        foreach (mtime in times) 
            query = queryTemplate % (mtemp, mstation, mcalendar, mtype, mname, mdate, mtime)
            curs.execute(query, )  
0 голосов
/ 27 декабря 2014

Следующий синтаксис работает в SQL Server 2008, но не в SQL Server 2005.

CREATE TABLE Temp (id int, name varchar(10));

INSERT INTO Temp (id, name) VALUES (1, 'Anil'), (2, 'Ankur'), (3, 'Arjun');

SELECT * FROM Temp;

id |  name
------------
1  |  Anil
2  |  Ankur   
3  |  Arjun     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...