POSTGRESQL INSERT, если конкретное имя строки не существует! - PullRequest
0 голосов
/ 14 марта 2011

Я пытаюсь ВСТАВИТЬ в мою базу данных Postgresql, только если моя модель не существует. Я использую соединение PDO, я пытаюсь IGNORE и 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");
    }
}

Спасибо

Ответы [ 2 ]

2 голосов
/ 14 марта 2011

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;
0 голосов
/ 14 марта 2011

Почему бы не использовать try-catch и просто перехватить дубликаты ключей? Таким образом, вы можете представить пойманные дубликаты для пользователя (если хотите).

...