鍍金池/ 問答/PHP  數(shù)據(jù)庫/ 如何批量插入Mysql并取得各自的遞增ID

如何批量插入Mysql并取得各自的遞增ID

我用 PHP 從文章中提取關(guān)鍵詞,平均一篇文章大約產(chǎn)生 100 多個(gè)詞,需要錄入 Mysql 的三個(gè)表,一個(gè)文章表,這個(gè)好說,一個(gè)詞語表,結(jié)構(gòu)如下:
id 自動(dòng)遞增,主鍵
term 詞語,唯一索引
第三個(gè)表就是詞語和文章的關(guān)系表(哪個(gè)詞出現(xiàn)在哪個(gè)文章里?)。

給定詞語 T,要取得它在詞語表里的 ID —— 如果尚不存在,則插入之。
最笨的辦法是,先 SELECT id from 詞語表 WHERE term = 'T',若沒有就 insert into ,再獲取 ID。

一個(gè)詞好說,但問題是,現(xiàn)在一篇文章產(chǎn)生了 100 多個(gè)詞,總不能也這么干吧。請問如何批量取得這些詞的 ID —— 如果某個(gè)詞不在就插入?

我想用存儲過程來辦,但 Mysql 的存儲過程能接收數(shù)組嗎?或者存儲過程接收一個(gè)TEXT參數(shù),把 100 多個(gè)詞用特殊字符拼起來?

求思路,謝謝??!

回答
編輯回答
懶豬

與其這樣,不如把自增的ID,改成自定義的ID。比如可以用 redis 的inc生成自增ID。

2018年1月30日 19:28
編輯回答
避風(fēng)港

在不考慮性能的情況下,這個(gè)是最快的,數(shù)據(jù)量小的時(shí)候可以用的,in的條件小于3000個(gè)
把存在的一次篩出來,對比不存在的,批量插入,再把所有詞的id一次拿出來

select id
from xxx
where term in ('xx','xx')
2017年9月24日 19:59
編輯回答
忘了我

用存儲過程搞定了,大家可以把下面代碼粘到NAVICAT里試一下:

CREATE DEFINER=root@% PROCEDURE fTest(IN a_Terms TEXT)
BEGIN

DECLARE l_TermsLen, l_TermLen INT;
DECLARE l_Term VARCHAR(20);

-- 測試用的臨時(shí)表
DROP TABLE IF EXISTS temp_terms;
CREATE TEMPORARY TABLE temp_terms (c_Term VARCHAR(20));

SET l_TermsLen = CHAR_LENGTH(a_Terms);
WHILE (l_TermsLen > 0) DO
    SET l_Term = SUBSTRING_INDEX(a_Terms, ',', 1);
    SET l_TermLen = CHAR_LENGTH(l_Term);
    SET a_Terms = SUBSTRING(a_Terms, l_TermLen + 2);
    SET l_TermsLen = l_TermsLen - (l_TermLen + 1);
    
    -- 按需把l_Term插入到詞語表,取得ID;這里插入到臨時(shí)表,最后顯示出來
    INSERT INTO temp_terms VALUES (l_Term);
END WHILE;

-- 顯示拆分出的詞語
SELECT * FROM temp_terms;

END

然后新建查詢,執(zhí)行:
CALL fTest('abc,你們,好')
輸出:
abc
你們

現(xiàn)在只需執(zhí)行兩個(gè)查詢就能完成任務(wù):
1 把文章插入到文章表,取得自動(dòng)遞增ID
2 把所有詞用逗號連接成一個(gè)字符串,和文章ID一起作為參數(shù),調(diào)用存儲過程,由它負(fù)責(zé)解碼各個(gè)詞,查詢它們的ID,按需插入到詞語表,最后把每個(gè)詞的ID和文章ID一起插入到關(guān)系表中。

2018年6月1日 00:35
編輯回答
小曖昧

問主自己的存儲過程中是一條一條插入的,我感覺還是比較慢,我的建議:

  1. 用 replace into 詞語表 values (...), (...)來批量插入詞語,并避免重復(fù)詞語
  2. 然后用select id from 詞語表 where term in (...)來獲取所有詞語的id
  3. 最后用insert into 關(guān)系表 values (...), (...)批量插入文章和詞語的對應(yīng)關(guān)系
2017年11月8日 01:44
編輯回答
櫻花霓

首先看看自己的需求什么樣,主要存下來干什么,如果只是為了統(tǒng)計(jì)某個(gè)詞的數(shù),一個(gè)文章表,一個(gè)詞語表就好了,
詞語表,文章id 詞,統(tǒng)計(jì)數(shù)的時(shí)候group by一下也就好了,也就不用管存不存在。

2018年1月30日 23:14