0

我需要在目标表中不存在记录的情况下插入 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 服务器版本相对应的手册,以在第 2 行的 'WHERE NOT EXISTS ( SELECT * FROM commentWHERE mid=180 AND 'pid'附近使用正确的语法

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

4

3 回答 3

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
);

编辑:更好的方法:

要从表中删除重复项,请参见此处

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'
);
于 2012-07-26T09:55:57.433 回答
0

添加一个ignore

INSERT IGNORE INTO comment ...

以防止重复插入。您不能whereinsert.

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

取自MySQL INSERT 文档

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

如果你想UPDATE在重复的情况下进行,那也是可能的。看这里

于 2012-07-26T09:52:26.243 回答
0

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

于 2012-07-26T09:57:58.003 回答