2012-03-25 6 views
5

У меня есть 2 таблицы, table_a и table_b.MySQL INSERT или SELECT

CREATE TABLE `table_a` (
`ID` int(11) unsigned NOT NULL AUTO_INCREMENT, 
`val` varchar(64) NOT NULL, 
PRIMARY KEY (`ID`), 
UNIQUE KEY `val` (`val`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 

CREATE TABLE `table_b` (
`ref_a` int(11) unsigned NOT NULL, 
`data` int(11) unsigned NOT NULL, 
UNIQUE KEY `unique_index` (`ref_a`,`data`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 

Я хотел бы MASS ВСТАВИТЬ в таблице B со значением ref_a со ссылкой на ID таблицы А.

Это то, что я пытаюсь выполнить:

SELECT ID FROM table_a WHERE val = "123" 

Если значение не существует, а затем вставить значение

INSERT INTO table_a(val) VALUES("123") 

Теперь, когда я получил идентификатор (предположим, что это «1»), я хочу, чтобы вставить Int o table_b:

INSERT INTO table_b(ref_a, data) VALUES(1, 75) 

Проблема возникает, когда я хочу сделать это оптом. Будет ли моя производительность снижаться, если я буду переключаться между SELECTS и INSERTS вместо того, чтобы делать объемную вставку, а затем выбирать маску?

Я мог бы сделать:

INSERT INTO table_b(ref_a, data) VALUES((SELECT ID FROM table_a WHERE value="123"), 75) 

, но, что если значение отсутствует, и мне нужно сделать вставку ранее.

Я не могу НАЧАТЬ TRANSACTION и COMMIT, давая мне, чтобы мне нужно получить идентификатор таблицы A после вставки.

Я также могу сделать:

  • Bulk вставки в таблицу А.
  • Выберите все идентификаторы из таблицы А.
  • Вставка в таблицу B, используя выбранные идентификаторы.

Но им нужен альтернативный путь.

Что было бы НАИБОЛЕЕ ЭФФЕКТИВНЫМ способом выполнить то, что я пытаюсь сделать?

+1

Откуда берутся эти значения ('123',' 75')? Еще один стол? Приложение? Файл? –

+0

Является ли 'a.ID' уникальным и поле автоматического приращения? – SenorAmor

+0

значения 123, 75 поступают из другой таблицы - у меня есть доступ к этим значениям. a.ID уникален, auto increment yes – nick

ответ

1

Я предлагаю вам использовать хранимую процедуру, которая будет делать проверку на правую вставку: stored routine

Это будет что-то вроде

CREATE PROCEDURE insertdata(IN i_value VARCHAR(32), IN i_data INT(11)) 
BEGIN 
DECLARE v_insertID INT DEFAULT -1; 

SELECT ID INTO v_insertID FROM table_a WHERE value = i_value; 

IF -1 = v_insertID 
THEN 
    INSERT INTO table_a(value) VALUES(i_value); 
    SELECT ID INTO v_insertID FROM table_a WHERE value = i_value; 
END IF; 

IF -1 != v_insertID 
THEN 
    INSERT INTO table_b(ref_a, data) VALUES(v_insertID, i_data); 
END IF; 

END 

Мы проверяем, если запись с заданным значением существует, если мы не создаем его, мы извлекаем идентификатор записи create, а затем вставляем данные в таблицу_b (если запись была действительно создана)

Таким образом, вам нужно только вызвать процедуру из php для каждой записи.Это будет гораздо более эффективно, чем делать все эти испытания в PHP (что потребует более одного MySQL вызова)

+0

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

3

Сначала убедитесь, что у вас есть UNIQUE INDEX на колонке значения в TABLE_A, затем сделать большую часть INSERT IGNORE

INSERT IGNORE INTO table_a(value) VALUES("123"), ("345"), ("afasd"), ("#$#$%"), ... 

Теперь вы уверены, что все значения указаны в таблице_a, и вы можете безопасно использовать свой метод вставки в массив table_b.

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