我有两张桌子。一个表包含单词。其他表包含点。
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
怎么做?
答案 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);