Какая уловка в MySql (версия 4) позволяет писать из PHP thtree Inserts и быть уверенным, что мы можем правильно связать таблицы.
[Table1]-[LinkTable]-[Table2]
В коде PHP я создаю Insert, которая добавляет 1 строку в таблицу 1 и другую Insert, которая добавляет другую строку в таблице 2. Я получаю PK (первичный ключ) обеих строк с двумя SELECT, которые возвращают мне последнюю строку каждой таблицы. Таким образом я получаю PK (автоинкремент) из таблиц 1 и 2 и вставляю его в таблицу ссылок.
Проблема в том, что это не атомарно, и теперь, когда я получаю много транзакций, они не связываются должным образом.
Как я могу связать две таблицы в MySQL 4, которые сохраняют данные? Я не могу использовать какие-либо хранимые процедуры.
Моя репутация скорректирована, я не планирую быть такой гиперактивной, как раньше. Я пытаюсь быть в курсе всех новинок, напишите в блоге о нескольких вещах. Рад тебя видеть, Пол!






Что ж, если у вас есть возможность использовать таблицы InnoDB (вместо MyISAM), вы можете использовать транзакции. Вот примерный код
<?php
// Start a transaction
mysql_query( 'begin' );
// Execute the queries
if ( mysql_query( "insert into table_one (col1, col2) values('hello','world')" ) )
{
$pk1 = mysql_insert_id();
if ( mysql_query( "insert into table_two (col1, col2) values('foo', 'bar')" ) )
{
$pk2 = mysql_insert_id();
$success = mysql_query( "insert into link_table (fk1, fk2) values($pk1, $pk2)" );
}
}
// Complete the transaction
if ( $success )
{
mysql_query( 'commit' );
} else {
mysql_query( 'rollback' );
}
Если вы не можете использовать таблицы InnoDB, я предлагаю изучить шаблон Единица работы.
Это MyISAM. Я проверю, могу ли я что-нибудь изменить.
+1 для информации, сначала я попробую решение pendexgabo, так как оно требует меньших изменений.
ваша проблема здесь:
SELECTs that return me the last row of each tables.
если вы сделали что-то вроде этого: SELECT MAX (id) FROM table, вы можете получить неправильный идентификатор для своей транзакции.
Это обычное отношение "многие ко многим"
как говорит BaileyP, вам следует использовать функцию mysql_insert_id ().
в http://ar2.php.net/mysql_insert_id
ты можешь читать
Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query.
так что не волнуйтесь, вставляет ли другой процесс строку в ту же таблицу. вы всегда будете получать последний идентификатор вашего текущего соединения.
Я посмотрю на этот метод сразу после выполнения другого задания. Если это сработает так, как я надеюсь, вы сэкономите мне время!
+1 раз уж вы научили меня этому методу. Не знал о mysql_insert_id. Если ваше решение сработает, я приму ваш ответ. До скорой встречи.
Это решение хорошо работает. Еще не тестировал много потоков с несколькими потоками, но я думаю, что все будет хорошо, потому что InnoDB будет слишком много для этой версии. Возможно, я попробую позже. Спасибо
Эй, ты вернулся! Я думал, мы потеряли тебя после рефакторинга Джеффа. Рад это видеть.