Каков наилучший способ заполнить две таблицы записями, которые должны ссылаться друг на друга? - PullRequest
1 голос
/ 26 января 2009

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

В моих мыслях либо есть таблица "связей" между ними, которая заполняется после записи обоих в БД, либо с помощью следующей сложной серии команд

Insert1
get identity1
Insert2 
get identity2
update 1

Как бы вы сделали это в PHP, подключившись к базе данных mySQL и сохраняя целостность?

Вам нужно было бы использовать транзакции, если да, как бы вы поступили?

Ответы [ 3 ]

3 голосов
/ 26 января 2009

Могу я спросить, почему таблицы должны ссылаться друг на друга? Если это прямое соотношение 1: 1, я бы предложил поместить внешний ключ в одну из таблиц. поиск так же просто. И ваш внешний ключ может быть правильно применен. в противном случае вы столкнетесь с сценарием «курица / яйцо», где обе таблицы должны ссылаться друг на друга. но нужно сначала создать. Это означает, что в определенный момент ваша база данных будет в несогласованном состоянии.

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

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

mysql_query("START TRANSACTION");
if(!mysql_query($query1))
{   $errmsg=mysql_error();
    mysql_query("ROLLBACK");
}
else
{  $id1=mysql_insert_id();
   $query2="insert into.....$id1...");
   if(!mysql_query($query2))
   {   $errmsg=mysql_error();
       mysql_query("ROLLBACK");
   }
   $id2=mysql_insert_id();
   if(!mysql_query("update tabel1 set my_key=$id2 where key=$id1"))
   {   $errmsg=mysql_error();
       mysql_query("ROLLBACK");
   }

}
mysql_query("COMMIT");
0 голосов
/ 26 января 2009

Вам нужно использовать транзакции. MySql поддерживает это в более новых версиях, если вы используете механизм хранения InnoDb (но не для MyIsam).

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