Php MySQL插入或选择

Php MySQL插入或选择,php,mysql,Php,Mysql,我有两张桌子,a桌和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) unsigne

我有两张桌子,a桌和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
我想在表B中大量插入ref_a值,参考表a的ID

这就是我试图实现的目标:

SELECT ID FROM table_a WHERE val = "123"
如果该值不存在,则插入该值

INSERT INTO table_a(val) VALUES("123")
现在我得到了ID(假设它是“1”),我想在表_b中插入:

INSERT INTO table_b(ref_a, data) VALUES(1, 75)
当我想批量做这件事时,问题就来了如果我在选择和插入之间交替,而不是在批量插入之后再批量选择,我的性能会下降吗?

我可以做到:

INSERT INTO table_b(ref_a, data) VALUES((SELECT ID FROM table_a WHERE value="123"), 75)
但是,如果缺少该值,我需要在之前进行插入,该怎么办

如果在插入后需要检索表A的ID,则无法开始事务和提交

我还可以做:

  • 批量插入表A
  • 从表A中选择所有ID
  • 使用所选ID插入表B
但是我在寻找另一种方法


完成我要做的事情最有效的方法是什么?

我建议您使用一个存储过程来检查插入是否正确:

大概是

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,然后将数据插入表_b中(如果确实创建了条目)


因此,您只需为每个条目从php调用例程。它将比在php中进行所有这些测试(需要不止一个mysql调用)优化得多。

首先确保表a的值列上有一个
唯一索引,然后执行批量
插入忽略

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

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

这些值(
123
75
)来自哪里?另一张桌子?申请书?一个文件?是
A.ID
唯一的,一个自动递增字段?值123、75来自另一个表-我可以访问这些值。a、 ID是唯一的,自动递增是唯一的a值吗?或者同一个a.value可以有多个a.ID?代码为王。给出
createtable
语句,而不是即席模式或表结构的部分SQL描述。一个主要的目标是尽可能地易于使用(复制、粘贴、编译、运行)。这正是我所需要的。我以前试图创建一个函数,但失败了。谢谢我们将看看它的性能如何