gpt4 book ai didi

php - InnoDB:复制许多记录及其标签成员资格

转载 作者:行者123 更新时间:2023-11-29 13:21:39 24 4
gpt4 key购买 nike

外键可能适合此问题/解决方案。但是,我继承了这段代码和db,它们不使用外键,因此很难添加它们。如果绝对有必要,我可以这样做,但我不想这样做。

假设我在 InnoDB 数据库中有一组非常简单的表,用于存储一堆笑话,每个笑话都属于特定组,并且可能有一个或多个关联标签用它。我正在使用 PHP/MySQLi 来完成这项工作。假设表格如下所示:

GROUPS
id (int, primary, auto_inc) | group_name (varchar[64])
============================================================
1 knock, knock jokes
2 one-liners

JOKES
id (int, primary, auto_inc) | group_id (int) | joke_text (varchar[255])
=============================================================================
1 1 interrupting cow. inte-MOO!

TAGS
id (int, primary, auto_inc) | tag_text (varchar[255])
=============================================================================
1 explicit
2 hilarious

JOKE_TAGS
id (int, primary, auto_inc) | joke_id (int) | tag_id (int)
=============================================================================
1 1 1

即使在这些笑话的上下文中没有任何意义,我们只能说用户可以选择将笑话从一个组复制到另一个组。感谢本网站用户的帮助,我发现最简单的方法如下:

INSERT INTO jokes (group_id,joke_text)
SELECT '$dstGroupID', r2.joke_text FROM jokes AS j2
WHERE j2.group_id = '$srcGroupID';

这似乎工作得很好。然而,我完全不知道如何有效地复制标签成员资格。例如,如果我要将 jokesgroup.id=1 复制到 group.id=2(使用上面显示的示例数据) ),我希望 JOKE_TAGS 表看起来像这样:

JOKE_TAGS
id (int, primary, auto_inc) | joke_id (int) | tag_id (int)
=============================================================================
1 1 1
2 2 1

在我的一生中,我根本无法找到一种方法来做到这一点,而不丢弃上面的 SQL 并简单地迭代正在复制的每个笑话,其逻辑看起来像这个:

  • 提取笑话信息
  • 提取该笑话的标签成员(member)资格
  • 使用上面提取的信息将新记录插入 JOKES
  • 获取新插入的笑话的 ID
  • 使用上面获取的 ID 将新记录插入 JOKE_TAGS

与上面列出的“复制”SQL 相比,这显然效率极低。如果有人可以提出更有效的解决方案,我将不胜感激。

最佳答案

您已经在使用外键,即使它们没有被强制执行。您所描述的是数据结构的根本性变化。从 1:1 到 1:n:一个笑话存在于一个组中,一个笑话存在于多个组中。

因此,正常的修复方法是将 group_id 字段从 jokes 表中移出并移入链接表:

jokes <-> joke_groups <-> groups

在这种情况下,简单的“复制”将涉及在链接表中插入新记录:

 (joke #1, group #7) // existing joke/group link
(joke #1, group #3) // "copying" the joke into group #3

如果您无法更改架构以适应结构的变化,那么您将不得不手动复制笑话:

 a) get contents of joke record
b) insert copied data back into joke record to create a NEW joke
c) get ID of new record
d) copy all tags from old id, insert with new linkages to new joke's ID

通常这就像几个INSERT INTO ... SELECT FROM类型的查询一样简单,但是MySQL不允许您从插入的同一个表中进行选择,所以需要通过客户端进行往返。

关于php - InnoDB:复制许多记录及其标签成员资格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20750748/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com