添加对查找表的引用,如果需要,插入查找


Add reference to lookup table, insert in lookup if needed

我想知道是否有一种更优雅(更高效)的方法来处理查找表。

假设我有一个表ITEM(i_id, i_name,…)一个表KEYWORD(k_id, k_name,…)和一个连接它们的表ITEM_KEYWORD(i_id, k_id)。

用户正在添加/更新一个项目,他们正在添加几个关键字(表单上的自由文本)。

foreach (keyword being added)
    SQL to find keyword in KEYWORD table
    if found we have the k_id
    if not, we SQL insert into KEYWORD table and get the new k_id
    now we can run an SQL to insert into ITEM_KEYWORD the i_id and k_id

每个添加的关键字最多3个SQL查询。有人有更好的办法吗?

// foreach
$this->db->query("
INSERT INTO KEYWORD (keyword)
VALUES ('hello')
ON DUPLICATE KEY UPDATE k_id = LAST_INSERT_ID(k_id)
");
$kid = $this->db->insert_id();

如果您将列k_id设置为索引PRIMARY, AUTO_INCREMENTkeyword作为UNIQUE,则只需要执行此一个(两次计数insert_id)查询。要么它不存在并且是insert,要么它只是做一个虚拟更新,但无论如何它都会返回k_id

参考

先做所有的查找,然后以某种方式对它们进行测试。

array keywords from query: 
  SELECT id,name from KEYWORD WHERE KEYWORD.name IN (list of keywords being added)
new = array_diff(keywords_to_add, keywords)
insert: INSERT INTO keyword (name) VALUES ( values of new keywords as multi-insert)
for each keyword being added:
INSERT INTO ITEM_KEYWORD i_id, k_id VALUES (?, (SELECT id FROM KEYWORD WHERE KEYWORD.name = ?))
相关文章: