Php MySQL插入或选择
我有两张桌子,a桌和b桌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
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描述。一个主要的目标是尽可能地易于使用(复制、粘贴、编译、运行)。这正是我所需要的。我以前试图创建一个函数,但失败了。谢谢我们将看看它的性能如何