如果特定行名称不存在,则 POSTGRESQL INSERT?

发布于 2024-10-21 23:25:52 字数 507 浏览 3 评论 0原文

仅当我的模型不存在时,我才尝试插入我的 Postgresql 数据库。我正在使用 PDO 连接,我尝试忽略和 ON DUPLICATE KEY UPDATE,但 PDO / 语法有错误。

我的代码:

if(isset($_POST['insertModel'])){
    
require("includes/connection.php");
    
    $models   = $_POST['name'];
    
    $parametros = array($models);
    
    $sth = $dbh->prepare("INSERT INTO models (name) VALUES ( ? )");
    
    $sth->execute($parametros); 
    
    if($sth){
        header("location: admin.php?model_inserted=1");
    }
}

I'm trying to INSERT in my Postgresql database only if my model don't exists. I'm using PDO connection, I try IGNORE and ON DUPLICATE KEY UPDATE but with errors in PDO / syntax.

MY Code:

if(isset($_POST['insertModel'])){
    
require("includes/connection.php");
    
    $models   = $_POST['name'];
    
    $parametros = array($models);
    
    $sth = $dbh->prepare("INSERT INTO models (name) VALUES ( ? )");
    
    $sth->execute($parametros); 
    
    if($sth){
        header("location: admin.php?model_inserted=1");
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

合久必婚 2024-10-28 23:25:52

ON DUPLICATE KEY UPDATE 是 MySQL 语法,而不是 PostgreSQL。 PostgreSQL 没有简单的 SQL 语法来完成您想要的操作。

文档 包含示例执行此操作的函数的代码。

CREATE TABLE db (a INT PRIMARY KEY, b TEXT);

CREATE FUNCTION merge_db(key INT, data TEXT) RETURNS VOID AS
$
BEGIN
    LOOP
        -- first try to update the key
        UPDATE db SET b = data WHERE a = key;
        IF found THEN
            RETURN;
        END IF;
        -- not there, so try to insert the key
        -- if someone else inserts the same key concurrently,
        -- we could get a unique-key failure
        BEGIN
            INSERT INTO db(a,b) VALUES (key, data);
            RETURN;
        EXCEPTION WHEN unique_violation THEN
            -- do nothing, and loop to try the UPDATE again
        END;
    END LOOP;
END;
$
LANGUAGE plpgsql;

ON DUPLICATE KEY UPDATE is MySQL syntax, not PostgreSQL. PostgreSQL doesn't have a simple SQL syntax to do what you want.

But the documentation includes example code for a function that does that.

CREATE TABLE db (a INT PRIMARY KEY, b TEXT);

CREATE FUNCTION merge_db(key INT, data TEXT) RETURNS VOID AS
$
BEGIN
    LOOP
        -- first try to update the key
        UPDATE db SET b = data WHERE a = key;
        IF found THEN
            RETURN;
        END IF;
        -- not there, so try to insert the key
        -- if someone else inserts the same key concurrently,
        -- we could get a unique-key failure
        BEGIN
            INSERT INTO db(a,b) VALUES (key, data);
            RETURN;
        EXCEPTION WHEN unique_violation THEN
            -- do nothing, and loop to try the UPDATE again
        END;
    END LOOP;
END;
$
LANGUAGE plpgsql;
寂寞清仓 2024-10-28 23:25:52

为什么不使用 try-catch 并只捕获重复的键呢?这样您就可以向用户呈现捕获的重复项(如果您愿意)。

Why not use a try-catch and just catch the duplicate keys? That way you can present the caught duplicates for the user (if you want to).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文