插入或选中时获取id

Get the id when inserted or selected

我要填写product_id的值。如果 article_code 不在 table 中,它会执行插入,但如果记录存在 我不知道如何 select 该记录的 ID 并分配给 product_id .

table "core_product" 看起来像这样:

这里是代码(函数内部):

DECLARE
    product_id int;
BEGIN
    INSERT INTO core_product(article_code) 
        SELECT NEW.article_code
        WHERE NOT EXISTS (
            SELECT id INTO product_id
            FROM core_product
            WHERE article_code = NEW.article_code
        )
        RETURNING id INTO product_id;
END

使用特殊变量FOUND:

DECLARE
    product_id int;
BEGIN
    SELECT id INTO product_id
    FROM core_product
    WHERE article_code = NEW.article_code;

    IF NOT FOUND THEN
        INSERT INTO core_product(article_code) 
        SELECT NEW.article_code
        RETURNING id INTO product_id;
    END IF;
END

如果 article_code 上存在唯一约束,您可以使用 重试循环 强化函数以应对竞争条件(如 Craig 在评论中建议的那样):

BEGIN
    LOOP
        SELECT id INTO product_id
        FROM core_product
        WHERE article_code = NEW.article_code;

        IF FOUND THEN
            EXIT; -- exit loop
        END IF;

        BEGIN
            INSERT INTO core_product(article_code) 
            SELECT NEW.article_code
            RETURNING id INTO product_id;
            EXIT; -- exit loop

        EXCEPTION WHEN unique_violation THEN
            -- do nothing, go to the beginning of the loop
            -- and check once more if article_code exists
        END;
    END LOOP;
    -- do something with product_id
END;