MySql и вставка данных в таблицу ссылок, как? - PullRequest
1 голос
/ 07 января 2009

Каков трюк в MySql (версия 4) для записи из PHP thtree Inserts и чтобы быть уверенным, что мы можем правильно связать таблицы.

[Table1]-[LinkTable]-[Table2]

В коде PHP я создаю Вставку, которая добавляет 1 строку в таблицу 1, и другую Вставку, которая добавляет другую строку в таблицу 2. Я получаю обе строки PK (первичный ключ) с двумя SELECT, которые возвращают мне последнюю строку каждый стол. Таким образом я получаю PK (автоинкремент) из Таблицы 1 и Таблицы 2 и вставляю его в таблицу ссылок.

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

Как я могу сделать связь между 2 таблицами в MySQL 4, которые сохраняют данные? Я не могу использовать любую процедуру на складе.

Ответы [ 2 ]

2 голосов
/ 07 января 2009

Ну, если у вас есть возможность использовать таблицы 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, тогда я предлагаю изучить шаблон Unit Of Work .

1 голос
/ 07 января 2009

Ваша проблема здесь:

SELECT, которые возвращают мне последний ряд каждой таблицы.

если вы сделали что-то вроде этого: ВЫБЕРИТЕ МАКС. (Id) ОТ table вы можете получить неверный идентификатор для вашей транзакции.

Это обычные отношения "многие ко многим"

Как говорит BaileyP, вам следует использовать функцию mysql_insert_id ().

при http://ar2.php.net/mysql_insert_id

Вы можете прочитать

Извлекает идентификатор, сгенерированный для столбца AUTO_INCREMENT по предыдущему запросу INSERT.

, поэтому все равно, если другой процесс вставит строку в ту же таблицу. вы всегда получите последний идентификатор для вашего текущего соединения.

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