2012-01-19 5 views
0

я сделка:MySQL транзакции - Элементы вставляются в обратном порядке

$dbh->beginTransaction(); 

$i = 0; 
while ($i < $total_items_num) { 
    $insert_data->execute(
    array($item_data[ $i ], 
      $category, 
      $price, 
    ) 
); 

    $i++; 
} 

$dbh->commit(); 

На моей локальной машине, элементы вставляются в надлежащем порядке, например, с 1 по 7-й. Но на сервере производства он вставлен в обратном порядке, например. с 7 по 1-е.

Какая возможная причина для этого, некоторые настройки, которые мне необходимо изменить?

EDIT: Вот запрос:

$insert_data = $dbh->prepare (" 
    INSERT INTO goods (
    item_id, 
    item_data, 
    category, 
    price 
    ) 
    VALUES (NULL, ?, ?, ?); 
    "); 

и порядок вещей должен был быть от 0 до независимо от количества. Например. 0-6, 0-15 ...

Так что я хочу (и то, что работает для меня локально), заключается в том, что item_id (который является первичным ключом) применяется к элементам в этом самом порядке, например. если у 1-го предмета был item_id 1025, то второй должен иметь 1026.

Но что происходит, они вставлены в обратном порядке.

Спасибо за предложения и извините, если вопрос был неопределенным, надеюсь, теперь лучше.

+0

Вы не сказали, что такое заказ и как он определяется в вашем случае. И не показали ** никакого ** запроса в вопросе. Буквально - я не вижу ничего **, связанного с mysql вообще – zerkms

+1

Я не знаю, почему это так, но в конечном итоге это не имеет значения. Порядок строк в MySQL (как и в большинстве RDBMS) не гарантируется. Если вы хотите получить данные в определенном порядке, вы должны использовать предложение ORDER BY в своем запросе, используя определенный вами столбец (например, 'created_at' или' position'). Дополнительная информация в этом вопросе: http://stackoverflow.com/questions/1793147/sql-best-practice-to-deal-with-default-sort-order –

+1

Помните, что строки в базе данных не упорядочены, если вы не 'ORDER BY' в запросе. – jkj

ответ

1

Я хотел бы предложить несколько вещей, чтобы проверить:

  1. ли ваш DEV и производственной среды имеют одинаковые индексы таблицы, которая касается?

  2. Если нет, проверьте, совпадает ли ваш запрос на подтверждение в обоих случаях.

Если ваш ответ да, в обоих случаях, то правило это один другие комментарии указывают: записи таблицы РСУБД»в ResultSets не обязательно„заказать“, если не использовать ORDER BY в запросах или вы настроили некоторую индексацию.

0

Базы данных SQL не имеют понятия неотъемлемого порядка строк. Заказ применяется только тогда, когда вы явно указываете предложение ORDER BY в запросе. В отсутствие ORDER BY механизму базы данных разрешено возвращать строки в любом порядке, который он выбирает.

Что касается нумерации последовательностей, вы не указали, как определена таблица, или как заполняется $item_data, так что на данный момент вопрос невозможен.

+0

Спасибо. Но как я могу явно указать порядок в моем предыдущем запросе? В основном я выполняю готовый оператор снова и снова во время цикла, поэтому первичный ключ должен автоматически увеличиваться. Но вместо этого он сначала вставляет в базу данных последний элемент, указанный в цикле, и идет назад. Это заставляет меня думать, что это имеет какое-то отношение к транзакции, но любой ключ приветствуется. – CodeVirtuoso

+0

В производственной среде может быть разница в том порядке, в котором данные загружаются в '$ item_data'. Можете ли вы показать, как это происходит? –

+0

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