在插入之前检查是不是存在时我的语法错误
Posted
技术标签:
【中文标题】在插入之前检查是不是存在时我的语法错误【英文标题】:Error in my syntax when checking if exists before inserting在插入之前检查是否存在时我的语法错误 【发布时间】:2015-11-12 16:31:01 【问题描述】:我正在尝试确保在插入前一行不存在,但出现语法错误,这是我的 sql:
IF NOT EXISTS
( SELECT *
FROM profile_views
WHERE (profile_view_user = ?
AND profile_view_viewing = ?)
)
BEGIN
INSERT INTO profile_views
(
profile_view_user,
profile_view_viewing,
profile_view_ip
)
VALUES
(
?,
?,
?
)
END;
CREATE TABLE IF NOT EXISTS `profile_views` (
`profile_view_id` int(11) NOT NULL,
`profile_view_user` int(11) NOT NULL,
`profile_view_viewing` int(11) NOT NULL,
`profile_view_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`profile_view_ip` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
我得到的错误是:
警告:PDOStatement::execute(): SQLSTATE[42000]: 语法错误或 访问冲突:1064 您的 SQL 语法有错误;检查 与您的 mysql 服务器版本相对应的手册 在 'IF NOT EXISTS ( SELECT * FROM profile_views WHERE 附近使用的语法 (亲'在第 1 行我
如何修复我的 sql 查询?
【问题讨论】:
在 MySQL 中,您需要一个围绕该语句的外壳(如过程或函数)。只有查询才能代表自己 使用插入忽略代替? ***.com/questions/1361340/… 您不应该在尝试向其中插入记录之前检查表是否存在吗?例如如果表不存在,则创建它,如果记录不存在,则创建它们。如果记录不存在,而不是在可能尚不存在的表中创建它们? (如果表不存在并且您试图从中进行选择,第一条语句是否会完全炸毁?)此外,您不需要select *
来检查是否存在,单列就足够了.
如果您为表定义主键,您可以使用 INSERT IGNORE 忽略重复键错误,或使用 ON DUPLICATE KEY UPDATE 来捕获重复键错误(这些是 MySQL 特定的)
@Kritner 我认为表架构不是正在运行的查询的一部分(我可能错了)。
【参考方案1】:
尝试使用:
INSERT INTO profile_views(profile_view_user, profile_view_viewing, profile_view_ip)
SELECT * FROM (SELECT ?, ?, ?) AS tmp
WHERE NOT EXISTS (
SELECT * FROM profile_views WHERE
(profile_view_user = ? AND profile_view_viewing = ?') LIMIT 1;
【讨论】:
以上是关于在插入之前检查是不是存在时我的语法错误的主要内容,如果未能解决你的问题,请参考以下文章