Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1v1Gyt-006VGb-3l for pgsql-general@arkaria.postgresql.org; Wed, 24 Sep 2025 04:19:51 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1v1Gyr-009xIX-MK for pgsql-general@arkaria.postgresql.org; Wed, 24 Sep 2025 04:19:49 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1v1Gyr-009xIP-BZ for pgsql-general@lists.postgresql.org; Wed, 24 Sep 2025 04:19:49 +0000 Received: from mail-lf1-x132.google.com ([2a00:1450:4864:20::132]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1v1Gyn-002YKy-19 for pgsql-general@lists.postgresql.org; Wed, 24 Sep 2025 04:19:49 +0000 Received: by mail-lf1-x132.google.com with SMTP id 2adb3069b0e04-57b35d221e2so376240e87.3 for ; Tue, 23 Sep 2025 21:19:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758687585; x=1759292385; darn=lists.postgresql.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=NvU/WG0TXS7SgGt5eU2I2Xp4WPv2WY/2URLjgTiGk+k=; b=M2EX7ASt1wbc4TJWJABL1XhJGM1AL/0NwZXHHMHkb5Admxu8DdOCT7Q6fnu9noZu5Q 8+MXg8f+yRU8dYzB6fMdIJud/0CY+8dzv/hvE41/rsDRmkAZIcBytK3B0r16KJyen7Xo WRv+JHnU7hnp8l8Gi7r39TtgHvONTOfhUgVxCNwQVAPuq1yDAVhNi8Y5NIIZGusg96AU eVho0t9MhLlQ5zYPq9Bah75nIDxzA4PRcKPDMWbbMwcD0c9z5BeP56IIlrEkQHQwgv7k u6smNi1EU66jzs49RMJmxYlf3z256lEt9/t6udZzaB7i4WWtB2lDsP/fUvzkbugDW1qA X/PQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758687585; x=1759292385; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=NvU/WG0TXS7SgGt5eU2I2Xp4WPv2WY/2URLjgTiGk+k=; b=dFg9MrbNsnMj70QMVR8hc2xxb3yvqn0XW1PvxXaBlu7ro72zEVXkDtW3QB1e6kIvgZ MjS8LAv2iO4+8CpfBhz/Y3kE/1EqTvysj6vpcR34F5U5BSs3zcTmD+iIj0kXQMuRPo7g 8sXvqf53pYByJAojZfx5wHiZeVG1wSHBnOGJccUXLP0HfOCn7KrtWW1ow03343n1TIbB nx4fzacww8+AMuLghCcwuol5+cGx8lMiDqzYPvlWlJBHh/f6//8eGBXSQSKJTcu78hnV VgPf0B3rdDUNBd7AeKp6W0mq0FipjmA7NCiRV3N9CodkRAbGzI+h12/fyK+CATLzpV3D krOg== X-Gm-Message-State: AOJu0YwX/xBIkJbAfZNUzoTFtJ4vCfhTHj01tVYKbxUFekw13SZblK5T UlEW3Z6+Ke3ZXRv2AJ7BfRQXePjU7yTcutM5isLxcAyx6MzhaKvYhWGw6o4s1zccQ0Rs2eUrycC gh7mf/IEPWWwJRlGq2JvTP+LO6cOAVVU= X-Gm-Gg: ASbGncsVYiEdlJ94qZ9Qvkr+RHv4rP++88jmztrtTM6oYmuhTnQAXm3jWruk1kFbAok ylPxsJ/sGvRtQcR/FAs63FSHrjar/4nz0ONp0pmmjQ0Uln/wQNzqmuOdxhjjvuW7mBSeIqK32Yf CIRCVdz0Fvk0hSRymuIzvUq0nY+Nlsw8O9GjZNVOWqR0313Ge1U7rBTHZOZDtnyhQiPQbgYO/8l 10KB+a2 X-Google-Smtp-Source: AGHT+IEuBKnACi8hDxd3AWHnNs60ca+Ucw/PXvPT+lbUe2TwnyFajQiOcexFrgB7d1ZWHsNspz+xGrl6ROTG05XHdcI= X-Received: by 2002:a2e:a9a3:0:b0:36b:2bde:a02a with SMTP id 38308e7fff4ca-36d1680af25mr7823371fa.3.1758687585135; Tue, 23 Sep 2025 21:19:45 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Samuel Marks Date: Tue, 23 Sep 2025 23:19:33 -0500 X-Gm-Features: AS18NWCBkuTlZysN8VAeRA64IGbAh6xptw5HleDyy0WiKIRTcPfrCKLh23akvG0 Message-ID: Subject: Re: How do I upsert depending on a second table? To: Juan Rodrigo Alejandro Burgos Mella Cc: pgsql-general@lists.postgresql.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk Ok so you're thinking I give up on putting it all in one query and instead use a transaction? - Is that the recommended way? ```sql TRUNCATE repo, org; INSERT INTO org(name, owner) VALUES ('org0', 'user0'); ``` ```sql START TRANSACTION READ WRITE; SELECT 1/COUNT(*) FROM org WHERE name =3D 'org0' AND owner =3D 'wrong user'; INSERT INTO repo (id, full_name, org) VALUES (0, 'org0/name0 by wrong user', 'org0') ON CONFLICT (full_name) DO UPDATE SET full_name =3D EXCLUDED.full_name, org =3D EXCLUDED.org RETURNING id; COMMIT; ``` On Tue, Sep 23, 2025 at 7:25=E2=80=AFPM Juan Rodrigo Alejandro Burgos Mella wrote: > > Hi Samuel > > Using ON CONFLICT is a headache. > It's better to use the versatility of a Trigger: you have the full record= at your fingertips, and if you're going to UPDATE, you have the previous r= ecord too. > There's much more control. > > Also, you can always count on the beloved foreign keys, which are also qu= ite useful. > > Atte. > JRBM > > > El mar, 23 sept 2025 a las 15:37, Samuel Marks () = escribi=C3=B3: >> >> Attempt: >> ```sql >> CREATE TABLE org >> ( >> "name" VARCHAR(50) PRIMARY KEY, >> owner VARCHAR(50) NOT NULL >> ); >> >> CREATE TABLE repo >> ( >> "id" INTEGER PRIMARY KEY, >> full_name VARCHAR(255) UNIQUE NOT NULL, >> org VARCHAR(50) NOT NULL REFERENCES org ("name") >> ); >> >> INSERT INTO org(name, owner) VALUES ('org0', 'user0'); >> >> INSERT INTO repo (id, full_name, org) >> VALUES (0, 'org0/name0 by wrong user', 'org0') >> ON CONFLICT (full_name) DO UPDATE >> SET full_name =3D EXCLUDED.full_name, >> org =3D EXCLUDED.org >> WHERE EXISTS (SELECT 1 >> FROM org org_tbl >> WHERE org_tbl.name =3D EXCLUDED.org >> AND org_tbl.owner =3D 'wrong user') >> RETURNING *; >> >> SELECT * FROM repo WHERE id =3D 0; >> ``` >> >> This all succeeds. It should fail because the 'wrong user' is trying >> to create a new=E2=80=94or update an existing=E2=80=94repo. >> >> Thanks for all suggestions >> >>