SQL=如果不存在于准备好的语句中



我正在检查表中是否已经存在记录,如果不存在,我想执行插入。。。使用事先准备好的语句。有人能告诉我下面出了什么问题吗?我写的代码带有错误检查,它基本上说查询是poo:)当涉及到SQL和几乎任何与编程相关的东西时,我都很糟糕,所以我真的很感激在这个看起来不可靠的任务中分享的任何智慧。。。谢谢

        $mysqli = mysqli_connect($config['host'], $config['user'], $config['pass'], $config['db']);  
        $timestamp = time();  
        $stmt = $mysqli->prepare("IF NOT EXISTS (SELECT id FROM course_licence_cart WHERE userid = ? AND courseid = ? AND lmsid = ?) BEGIN INSERT INTO course_licence_cart (lmsid, userid, courseid, assigned_by, assigned_on) VALUES (?, ?, ?, ?, ?) END");
        foreach($_POST['assignTo'] as $assignTo){
            $stmt->bind_param('iiiiiiii', $assignTo, $_POST['course'], $core['id'], $core['id'], $assignTo, $_POST['course'], $userInfo['id'], $timestamp);
            $stmt->execute();
        }

仅供参考:这发生在表单提交之后,我检查了所有的变量,它们都很好,流程本身运行得很好(我让它在没有IF NOT EXISTS的情况下运行),正是这种新的查询类型与准备好的语句混合在一起,让我完全失望了。

-更新--

我直接运行了以下内容:

IF NOT EXISTS (SELECT `id` FROM `course_licence_cart` WHERE `userid` = '175' AND `courseid` = '1' AND `lmsid` = '1') BEGIN INSERT INTO `course_licence_cart` (`lmsid`, `userid`, `courseid`, `assigned_by`) VALUES ('1', '175', '1', '175') END

在其中我得到了错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF NOT EXISTS (SELECT `id` FROM `course_licence_cart` WHERE `userid` = '175' AND' at line 1

首先错误的根源与准备好的语句无关。只是不能在存储例程(过程、函数、触发器、事件)的范围之外使用IFBEGIN ... END块和其他构造。

为了防止重复,您可以像一样利用INSERT IGNORE

$stmt = $mysqli->prepare("INSERT IGNORE INTO course_licence_cart (lmsid, userid, courseid, assigned_by, assigned_on) VALUES (?, ?, ?, ?, ?)");
foreach($_POST['assignTo'] as $assignTo){
    $stmt->bind_param('iiiiiiii', $assignTo, $_POST['course'], $core['id'], $core['id'], $assignTo, $_POST['course'], $userInfo['id'], $timestamp);
    $stmt->execute();
}

为了实现这一点,您必须定义一个唯一的约束。

CREATE UNIQUE INDEX index_name 
    ON course_licence_cart (userid, courseid, lmsid);

这是SQLFiddle演示


现在,您的代码(在更正语法后)可以在类似的存储过程中工作

DELIMITER //
CREATE PROCEDURE add_to_cart(IN _lmsid INT, IN _userid INT, _courseid INT, IN _assigned_by INT, IN _assigned_on DATETIME)
BEGIN
    IF NOT EXISTS (SELECT *
                     FROM course_licence_cart 
                    WHERE userid = _userid 
                      AND courseid = _courseid
                      AND lmsid = _lmsid) THEN
        INSERT INTO course_licence_cart (lmsid, userid, courseid, assigned_by, assigned_on) 
        VALUES (_lmsid, _userid, _courseid, _assigned_by, _assigned_on);
    END IF;
END//
DELIMITER ;

这是SQLFiddle演示

在这种情况下,php代码看起来像

$stmt = $mysqli->prepare("CALL add_to_cart (?, ?, ?, ?, ?)");
foreach($_POST['assignTo'] as $assignTo){
    $stmt->bind_param('iiiiiiii', $assignTo, $_POST['course'], $core['id'], $core['id'], $assignTo, $_POST['course'], $userInfo['id'], $timestamp);
    $stmt->execute();
}

由于您使用PHP进行编码,需要考虑的一件事是从该表对SELECT执行sql查询,如果没有返回任何内容,则运行插入查询。

我确信它可以通过SQL实现,但我个人不知道如何实现。

祝你好运,如果没有帮助的话,很抱歉。

在MYSQL中,有4种类型的插入可用。1) 插入2)插入忽略3)插入重复的密钥4)替换

请探究它们。据我所知,您的具体情况可以通过INSERT IGNORE命令来处理。

注意:我在这里假设Mysqli与MYSQL 相同

更新:现在我知道mysqli是MYSQL的接口。但是insert-ignore的概念仍然是一样的。理解INSERT IGNORE用法的示例考虑下表。

CREATE TABLE person_tbl(last_name CHAR(20)NOT NULL,last_name CHAR(20)NOT NULL,sex CHAR(10),PRIMARY KEY(last_name,first_name));

此处为firstname&姓氏形成主密钥

现在我们运行查询

mysql>插入person_tbl值('Jay','Thomas');

它将在表中添加一行

如果我们要运行上面的sql,它将失败,并出现重复的记录异常。为了防止这种异常,我们有两个选项

1) 检查记录是否已存在,如果不存在,则插入记录。。。。我们必须激发select,然后插入查询。

2) fire INSERT IGNORE SQL。。它将检查表中是否存在记录如果存在则不插入记录,如果不插入则插入记录。

例如如果我们运行查询

mysql>将IGNORE插入person_tbl值('Jay','Thomas');

此sql不会插入任何记录。。由于记录已存在

但是

mysql>将IGNORE插入person_tbl值('Vijay','Thomas');

它将在表中插入一条记录。

最新更新