数据库
首页 > 数据库> > 有效插入/更新mysql m:n关系

有效插入/更新mysql m:n关系

作者:互联网

我正在开发一个HTML5多人游戏,我在表格“关键字”和“模型”之间有一个m:n关系,如下图所示:

keyword.id和model.id是auto_increment unsigned int,keyword.keyword是唯一索引.
为了提高效率,我正在寻找一种管理关系的方法.琐碎的方式是:

>检查关键字是否已存在
>如果是:从model_has_keyword更新timesCount和roundCount
>如果否:插入关键字并插入到model_has_keyword中

但随着越来越多的用户同时玩,我担心这种琐碎的方式会变得太慢.那么最有效的方法是什么?

在StackOverflow上搜索时,我已经弄清了两个想法,但我认为它们都不符合我的需求.

> INSERT INTO表ON DUPLICATE KEY UPDATE col = val
如果要处理INSERT INTO,我需要触发另一个INSERT INTO语句以插入两个表中的keyword和model_has_keyword
> REPLACE语句:如果我替换table关键字中的记录,则会为id分配下一个自动增量值,以便丢失表model_has_keyword的引用.

由于我不是专家,如果我在这里误解了一些内容,请纠正我.

解决方法:

您需要检查关系是否存在,然后插入/更新.

A.-在try块中包含INSERT查询,并在出现错误时进行更新查询.当关系不存在时,这将保存所有检查…

B.-使所有INSERT重置为DUPLATE.这与“A”中的完全相同,但您不必担心异常.

绝对是你的第二个想法是绝对错误的.

我不会创建表关键字,因为你只需要关键字本身……然后我会像这样定义我的model_has_keyword:

CREATE TABLE model_has_keyword (
  model_id         INT NOT NULL,
  keyword          VARCHAR(50) NOT NULL,
  timesCount       INT NOT NULL,
  roundCount       INT NOT NULL,
  PRIMARY KEY (model_id,keyword)
);

并像这样更新它:

INSERT INTO model_has_keyword 
  (model_id,keyword,timesCount,$myIntValue) 
VALUES 
  ($model_id,$keyword,0,0) 
ON DUPLICATE KEY UPDATE 
  timesCount=timesCount+1,roundCount=roundCount + $myIntValue

标签:mysql,many-to-many,relation,insert-update
来源: https://codeday.me/bug/20190630/1333513.html