【问题标题】:How to INSERT SELECT... WHERE NOT EXISTS SELECT?如何插入选择...哪里不存在选择?
【发布时间】:2013-10-25 13:48:10
【问题描述】:

我在表 exp_weblog_titles t 中有一系列博客条目。在表 exp_categories c 中按类别分类,并由表 exp_category_posts cp 连接。

类别中有父子关系。此时,我想将我目前归类为 4810 类别子项的所有条目,并将这些条目本身归类为 4810 类别。

这是我为此操作提出的(未经测试的)查询:

INSERT INTO exp_category_posts (entry_id,cat_id)
(select distinct(t.entry_id), '4810' 
from
    exp_weblog_titles t
        left join
    exp_category_posts cp ON t.entry_id = cp.entry_id
        left join
    exp_categories c ON c.cat_id = cp.cat_id
where
    t.weblog_id = 5 and c.parent_id = 4810)

但我想避免在可能存在相同记录的 category_posts cp 中插入新的连接记录。

我无法理解“不存在的地方”。它应该是插入操作、子选择的一部分吗?怎么都想不通。

应该是这样的:

IF NOT EXISTS 
SELECT * FROM exp_category_posts 
where cat_id = 4810 and entry_id = $thecurrentrow

但是我要引用当前行吗?

这是在 ExpressionEngine 1 中。

更新来自 Mats 的回答: (entry_id, cat_id) 上没有唯一键。不确定添加一个的后果。

【问题讨论】:

  • 只是一个注释。如果没有键,则每次插入都需要进行全表扫描,这在性能方面非常昂贵。如果您要执行大量此类插入操作而不是在应用程序层中执行工作,那么在表上建立索引可能会很好。 更新:表格中有多少行?

标签: mysql expressionengine


【解决方案1】:

假设(entry_id, cat_id)exp_category_posts 中的唯一键,您应该可以使用INSERT IGNOREINSERT IGNORE 将跳过插入时会产生重复键错误的记录。

您可以在参考手册http://dev.mysql.com/doc/refman/5.5/en/insert.html 中找到更多信息。

【讨论】:

  • 谢谢垫子。目前没有这样的密钥,我不确定创建它的后果。在我看来,EE 的设计理念是将大部分此类逻辑放入应用层。
  • 您将添加一个索引。它占用空间,如果您有大桌子,可能会占用很多空间。不过,它可以防止重复条目,这似乎是您无论如何都想为这个表做的事情。
猜你喜欢
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 2020-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多