Istnieją pewne ograniczenia:INSERT, jeśli nie istnieje, inny id powrót
- nie można modyfikować w bazie
- Kolumny nie są unikalne
- musi wrócić id ostatni wkładka (
RETURNING id
) - Jeśli istnieje, return istniejący identyfikator
- Zostanie wywołany przez naszą niestandardową bibliotekę db (wartości w select będą jako parametry z PHP (?,?,?,!))
INSERT INTO tags (name, color, groupid)
SELECT 'test', '000000', 56
WHERE NOT EXISTS (
SELECT text FROM tags WHERE name = 'test' AND groupid = 56
)
RETURNING id
To działa - aż do punktu, w którym muszę się istniejący id również. Dzięki temu otrzymam tylko wstawiony identyfikator. Czy można zwrócić wartość instrukcji SELECT, jeśli nie zostanie ona wstawiona?
UPDATE:
DO $$
BEGIN
IF NOT EXISTS (
SELECT text FROM tags WHERE name = 'test' AND groupid = 56
)
THEN
INSERT INTO tags (name, color, groupid)
VALUES ('test', '000000', 56) RETURNING id;
ELSE
RETURN SELECT text FROM tags WHERE name = 'test' AND groupid = 56;
END IF;
END
$$
testował z takim formacie - jednak ten kończy się z kilkoma błędami:
RETURN cannot have a parameter in function returning void
Można uniknąć tego ostatniego błędu dokonując nazwie funkcji zamiast 'oświadczenie DO', z dokładnie to samo ciało, np 'UTWÓRZ FUNKCJĘ foo (tekst, tekst, int) POWRÓT int LANGUAGE plpgsql AS $$ ....'; następnie możesz wykonać go jako 'SELECT foo (?,?,?) AS id' – IMSoP
Do testowania i stworzyłem go jako funkcję, wynik jest po prostu nieco inny bit:'ERROR: zapytanie nie ma miejsca docelowego dla danych wynikowych ' –
Dzieje się tak dlatego, że 'RETURNING id' jest jak' SELECT', musisz powiedzieć funkcji 'RETURN' o wyniku całej instrukcji 'INSERT', jak sądzę. – IMSoP