2009-07-28 5 views
1

Я имею дело с реляционной таблицей, и мне было интересно, есть ли способ уменьшить число запросов, которые мне нужно сделать при вставке данных в таблицы.Является ли это эффективным способом запроса реляционных таблиц в MySQL?

Ниже приведены запросы, которые я сейчас использую:

Я вставляю «основные» значения.

INSERT INTO products 
     (title, description, status, url) 
    VALUES 
     ('some title', 'description of doom', 1, 'some-title'); 

Мы вставляем это значение только в том случае, если оно еще не существует.

INSERT IGNORE INTO values 
      (value) 
     VALUES 
      ('example value'); 

Поскольку я не уверен, если запрос был фактически вставлен, я ид ..

  SELECT id 
       FROM 
        values 
       WHERE 
        value = 'example value'; 

Где "?" это идентификатор, полученный мной из последнего запроса.

   INSERT INTO link 
         (id_product, id_catalog, id_value) 
        VALUES 
         (33, 1, ?); 

Это означает, что каждое добавочное значение, которое мне нужно добавить, будет стоить 3 запроса. Поэтому мой вопрос: есть ли более эффективный способ сделать это?

+0

Это действительно хороший способ сделать это со мной. –

ответ

1

Вы можете сделать это, по крайней мере, отказаться от одного из запросов: «?»

INSERT INTO link 
    (id_product, id_catalog, id_value) 
VALUES 
    (33, 1, (SELECT id 
       FROM values 
       WHERE value = 'example value')); 

Я в основном я Замена с подбором второго запроса для получения идентификатора.

+0

Что произойдет, если «примерное значение» уже существует? Не игнорирует ли он дубликаты? –

+0

в зависимости от ваших ограничений, вы нарушите их. – northpole

+0

Итак ... Вы заставляете ошибку? –

0

«Есть ли более эффективный способ сделать это?»

Нет. Не совсем. Создание трех вещей занимает три вставки.

0

Вы должны быть в состоянии определить, была ли вставка выполнена с помощью функции ROW ___ COUNT() изнутри MySQL. При вызове с другого языка (например, PHP) функция mysql_query или эквивалентная функция вернет счетчик строк.

0

Вы можете использовать заявление INSERT INTO ... ON DUPLICATE KEY UPDATE.

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

Смежные вопросы