MySQL Where Not Exists 根据 3 个值插入记录

Posted

技术标签:

【中文标题】MySQL Where Not Exists 根据 3 个值插入记录【英文标题】:MySQL Where Not Exists Insert Record based on 3 values 【发布时间】:2012-07-26 09:49:48 【问题描述】:

我需要在目标表中已不存在记录的情况下插入 mysql

我的查询

INSERT INTO comment (`mid`, `pid`, `comment_text`, `comment_date`, `comment_type`) 
 VALUES (180, 2, NULL, '2012-07-26 10:19:00', 'tag')  WHERE NOT EXISTS ( SELECT * FROM `comment` WHERE `mid`=180 AND `pid`=2 AND `comment_type`='tag')

但是当它运行时我得到这个错误

您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 在'不存在的地方(选择 * FROM comment WHERE mid=180 和 `pid' 在第 2 行

任何想法基本上我都想在匹配值时停止将重复行添加到此表中

【问题讨论】:

【参考方案1】:

尝试:

INSERT IGNORE INTO comment
(
 `mid`, `pid`, `comment_text`, `comment_date`, `comment_type`
)
(
    SELECT 180, 2, NULL, '2012-07-26 10:19:00', 'tag'
    FROM comment
    WHERE `mid`=180 AND
          `pid`=2 AND
          `comment_type`='tag'
    LIMIT 1
);

编辑:更好的方法:

从表中删除重复项see here

ALTER IGNORE TABLE comment ADD UNIQUE KEY ix1(mid, pid, comment_type);

INSERT IGNORE INTO comment
(
 `mid`, `pid`, `comment_text`, `comment_date`, `comment_type`
)
VALUES 
(
 SELECT 180, 2, NULL, '2012-07-26 10:19:00', 'tag'
);

【讨论】:

谢谢,但这仍在添加一行【参考方案2】:

为什么不只创建由 mid、pid 和 comment_type 列组成的唯一索引?

【讨论】:

好建议,但在这个用例中它不起作用,因为我需要其他用户添加标签并允许他们添加其他评论类型【参考方案3】:

添加ignore

INSERT IGNORE INTO comment ...

防止重复插入。您不能在 insert 中使用 where 子句。

如果您使用 IGNORE 关键字,则在执行 INSERT 语句时发生的错误将被视为警告。例如,如果没有 IGNORE,复制表中现有 UNIQUE 索引或 PRIMARY KEY 值的行会导致重复键错误并且语句被中止。使用 IGNORE,行仍然没有插入,但不会发出错误。

取自the MySQL INSERT Documentation

这意味着您应该向您的表添加一个唯一键(如果您还没有的话)以使数据库自行检查重复项。如果数据库发现重复,则不会生成 INSERT

如果你想创建一个UPDATE 以防出现重复,那也是可能的。见here

【讨论】:

感谢您的回复,请您进一步扩展您的答案,谢谢 感谢我确实有一个唯一的 id,这不是我试图防止重复的字段,基本上这个表中有 3 种类型的 cmets 'text'、'tag'、'view ' 用户可以根据需要添加任意数量的文本 cmets,但只有 1 个标签和 1 个视图,有多个用户可以根据 mid 插入 要实现相当复杂的条件,您可以编写一个before insert 触发器来为您检查。 cancel-insert-example

以上是关于MySQL Where Not Exists 根据 3 个值插入记录的主要内容,如果未能解决你的问题,请参考以下文章

MySQL exists 和 not exists 的用法

MySQL exists 和 not exists 的用法介绍

带有 INSERT 和 WHERE NOT EXISTS 的奇怪 SQL 行为

Oracle-where exists()not exists() in()not in()用法以及效率差异

SQL Server 2005 - WHERE NOT EXISTS 和 NOT EXISTS 内的复杂脚本

Exists 和Not Exists使用