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
WHEREmid
=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 的用法介绍
带有 INSERT 和 WHERE NOT EXISTS 的奇怪 SQL 行为
Oracle-where exists()not exists() in()not in()用法以及效率差异