MySql и вставка данных в таблицу ссылок, как это сделать?

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

[Table1]-[LinkTable]-[Table2]

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

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

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

Эй, ты вернулся! Я думал, мы потеряли тебя после рефакторинга Джеффа. Рад это видеть.

Paul Tomblin 07.01.2009 00:15

Моя репутация скорректирована, я не планирую быть такой гиперактивной, как раньше. Я пытаюсь быть в курсе всех новинок, напишите в блоге о нескольких вещах. Рад тебя видеть, Пол!

Patrick Desjardins 07.01.2009 00:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
1 835
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Patrick Desjardins 07.01.2009 00:32

+1 для информации, сначала я попробую решение pendexgabo, так как оно требует меньших изменений.

Patrick Desjardins 07.01.2009 00:50
Ответ принят как подходящий

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

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.

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

Я посмотрю на этот метод сразу после выполнения другого задания. Если это сработает так, как я надеюсь, вы сэкономите мне время!

Patrick Desjardins 07.01.2009 00:50

+1 раз уж вы научили меня этому методу. Не знал о mysql_insert_id. Если ваше решение сработает, я приму ваш ответ. До скорой встречи.

Patrick Desjardins 07.01.2009 00:51

Это решение хорошо работает. Еще не тестировал много потоков с несколькими потоками, но я думаю, что все будет хорошо, потому что InnoDB будет слишком много для этой версии. Возможно, я попробую позже. Спасибо

Patrick Desjardins 07.01.2009 04:22

Другие вопросы по теме