如何在某些条件下插入多个记录

时间:2012-06-29 17:41:54

标签: mysql performance stored-procedures

我有两张桌子。一个表包含单词。其他表包含点。

table words:

id word


table points:

id wordid x y 

单词列是唯一的。

我想编写存储过程,它接受输入当前x值和word | y值列表。

例如:

这是表格行的初始词:

id word
1  Carrot
2  Apple
3  Potato

我们称之为程序StoreData(x = 5, words = { Carrot:123, Onion:321 })

结果我们有:

Words table:

  id word
  1  Carrot
  2  Apple
  3  Potato
  4  Onion 


Points table:    
id wordid x  y 
1    1    5 123 
2    4    5 321

怎么做?

1 个答案:

答案 0 :(得分:2)

您无法将结构化数据作为参数传递给存储过程:您必须先将其插入某个(临时)表中,然后从过程中读取该表的内容。因此,您也可以直接插入目标表:

INSERT IGNORE INTO Words (word) VALUES ('Carrot'), ('Onion');

INSERT INTO Points (wordid, x, y)
  SELECT Words.id, 5, y
  FROM   Words NATURAL JOIN (
      SELECT 'Carrot' AS word, 123 AS y
    UNION ALL
      SELECT 'Onion'  AS word, 321 AS y
  ) AS t;

sqlfiddle上查看。

(顺便提一下,我的物化表t本质上是您在调用存储过程之前必须创建和填充的表格:

DELIMITER ;;
CREATE PROCEDURE StoreData(IN x INT) BEGIN
  INSERT IGNORE INTO Words SELECT word FROM args;
  INSERT IGNORE INTO Points (wordid, x, y)
    SELECT Words.id, 5, y FROM Words NATURAL JOIN args;
END;;
DELIMITER ;

DROP   TEMPORARY TABLE IF EXISTS args;
CREATE TEMPORARY TABLE args (word VARCHAR(20), y INT);
INSERT INTO args VALUES ('Carrot', 123), ('Onion', 321);
CALL StoreData(5);