在插入之前检查是不是存在时我的语法错误

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;

【讨论】:

以上是关于在插入之前检查是不是存在时我的语法错误的主要内容,如果未能解决你的问题,请参考以下文章

检查变量是不是存在 - Terraform 模板语法

SQL插入语句语法错误VB.net

MySQL插入查询错误

在我添加错误消息以检查 CapNum 是不是为空或已存在于数据库中之前,我的代码一直在工作

无法在 MySQL 语法错误中运行查询意外

您的 SQL 语法有错误;检查与您的 MySQL 服务器 PYTHON 对应的手册