LINUX.ORG.RU

MySQL race condition #2


0

1

В этой теме речь о race condition при добавлении записи в таблицу один из столбцов которой должен иметь уникальное значение (не повторяться) уже поднимался. Решение было найдено - добавить UNIQUE constraint к соответствующему столбцу в таблице и проверять возвращает ли mysql_query ошибку.

Теперь задача усложняется. Представим что у нас есть 2 таблицы `packages` и `files`. Каждый файл должен быть ассоциирован с package.

create table packages (
  id bigint unsigned auto_increment primary key,
  name varchar(255) not null
);

create table files (
  id bigint unsigned auto_increment primary key,
  name varchar(255) not null,
  path varchar(255) not null,
  package_id bigint unsigned not null
);

Здесь package_id ассоциирует файл с package.id.

Каким образом сделать так что бы files.name был уникальным для файлов из одного package'а? Очевидно что сделать files.name UNIQUE не явл. решением т.к. name должно быть уникально только в пределах одного package_id.

Такой код:

$q = mysql_query("SELECT COUNT(id) AS fn_ex FROM files WHERE name = '$file_name' AND package_id = '$package_id'");
$row = mysql_fetch_assoc($q);
mysql_free_result($q);
if ($row['fn_ex'] > 0) {
  $errors[] = "File name already in use";
} else {
  mysql_query("INSERT INTO files SET name = '$name', path = '$path', package_id = '$package_id'");
}

подвержен race condition'у (подробно описанному в предыдущей теме).

Так что же делать?

Ответ на: комментарий от par12b12

теперь тоже буду знать. Теперь вопрос - кто запрещает пользоваться какими-нибудь интерфейсами работы с СУБД вроде того же самого dbSimple или ADOLite и иже с ним?

OldFornit
()

предвидя в ближайшее время тему «MySQL race condition #3», скажу, что можно сделать UNIQUE constraint на 3 столбца. и даже более

heisenberg ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.