MySQL INSERT或SELECT

时间:2012-03-25 01:05:40

标签: php mysql

我有2个表table_a和table_b。

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 INSERT输入表B,其中ref_a值指的是表A的ID。

这就是我想要完成的事情:

SELECT ID FROM table_a WHERE val = "123"

如果该值不存在,则插入值

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

现在我得到了ID(假设它是“1”),我想插入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)

但是,如果缺少值并且我需要事先插入,那该怎么办呢。

我不能BEGIN TRANSACTION和COMMIT,因为我需要在插入后检索表A的ID。

我也可以这样做:

  
      
  • 批量插入表A。
  •   
  • 从表A中选择所有ID。
  •   
  • 使用选定的ID插入表B.
  •   

但我正在寻找另一种方式。

实现我想要做的最有效的方法是什么?

2 个答案:

答案 0 :(得分:3)

首先确保table_a中的值为UNIQUE INDEX列,然后批量INSERT IGNORE

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

现在您确定所有值都在table_a中,并且您可以安全地使用批量table_b插入方法。

答案 1 :(得分: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

我们检查是否存在具有给定值的条目,如果不是我们创建它,我们检索创建条目ID,然后将数据插入table_b(如果条目是真的创建的)

所以你只需要从php为每个条目调用例程。它将比在php中进行所有这些测试(将需要多个mysql调用)更加优化