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 1v19lC-0057sC-1z for pgsql-general@arkaria.postgresql.org; Tue, 23 Sep 2025 20:37:14 +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 1v19l9-007uu4-4O for pgsql-general@arkaria.postgresql.org; Tue, 23 Sep 2025 20:37:11 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1v19l8-007utw-Pt for pgsql-general@lists.postgresql.org; Tue, 23 Sep 2025 20:37:10 +0000 Received: from mail-lj1-x235.google.com ([2a00:1450:4864:20::235]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1v19l6-0023oY-2g for pgsql-general@lists.postgresql.org; Tue, 23 Sep 2025 20:37:09 +0000 Received: by mail-lj1-x235.google.com with SMTP id 38308e7fff4ca-363c852d6c3so6828601fa.1 for ; Tue, 23 Sep 2025 13:37:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758659825; x=1759264625; darn=lists.postgresql.org; h=content-transfer-encoding:to:subject:message-id:date:from :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=1Whqkqon9Kr4K82NNaq5CukO3fDoh027zyr5+t64Qxc=; b=LNANdJ33Bw50M4n+oEy+8xvvttmy0wYbOQ++mWx0l5lRIyGi4LEdPmUFXJP0mFhyFw BH5pnzFLn05WTzldy+f9FkCAoSGjvsFEveRWrQfr4B8+f4xRcwvhma2/A5gWNzOGgyLM QXS92VZsD9jaDjNDW30KoZ2hasv+EZ9nv8j6RBX5ZnvpMy+HKy7wRkpawKZAOc2ULU4D Q53DWPZACeHfHVK/dh5WI2va0RBPAWyF9InIsCcOE9/lqIJkMz5H+Q94fdOBNYYCpmnL XySFUwd5tfuOKvH+tv8GIqM4Ht2dGDDsb/v8G930Ttoop33h5z4nb3hTffrfFsF/sTKE CYiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758659825; x=1759264625; h=content-transfer-encoding:to:subject:message-id:date:from :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=1Whqkqon9Kr4K82NNaq5CukO3fDoh027zyr5+t64Qxc=; b=lWJOmpl1l6+fFGQooAXHM8BpBBooTSohqSna7qCrpCv5lc09oq8yzBrTrVQkXB9FtS jdGNfvr07Q6bTE9VU3xvdB1v/WKpOoHuaauH4o6MAZ4cjCarykycgi7o3/J0Vikxenb2 XmnN2Yd2SpV8RTJ9+NTa/5V94AONF4Ao0/c63fHTpo1vAztJsFUY7VhUpQ45q7YMh1vy J4ON6lDMTS3LZdk4VwrWRI9NrkNY1+3EmCPH+RT5qa+iaIADSwnieEIXGbAlmSgvfnjt 6+ZiR+ElpBYyNhEBBLf5SLEBbSPmyaUjeQ79LPqb/AzuOpOowVQnHvC3maT+dudsL/X7 z+6w== X-Gm-Message-State: AOJu0Yzs+oOKINdf0FOZF25U/1gmQ7Hb/LB/BkTpB3PbNVxarZb0LOYQ TJAQESbNNcm+t6Sux/i2NzhG7fKXxa7ptznZxbYvOgu/2SI0ePaZbBy+mBOnigjcL/nRnUYExHQ D9035Njc7EMpnpFZNAb5l+cX5PqnJJTELNTWe0dE= X-Gm-Gg: ASbGncvVRxFggcssbfqLHpqqQjn3hqNdz7L/6xNS1oDq81L0GelV8ydwRFXpQefTn6x WkDIAb1yOzHNYDOPw/N//RYewjfcu2b/k9/x/dGYCv5MMYFvl00ggtwmxsLDWjb9Dq67mNdS1E6 v+CML7bLXtnw/hzPMdPQf1N0e2AhHiNG/gklkURBsPX1wPS0gyJbnqaKnRuwTZO8Qv8JbrShEXw FKu/fwr X-Google-Smtp-Source: AGHT+IE6nmS9CZmRW9XrxRmtm+Qk+DEKvWoRZs3WrIk0PlXBWRf88P2Y5HduTVwso+hUB5wSLTXtGgzGat0k73+h4lw= X-Received: by 2002:a2e:a9a3:0:b0:36b:2bde:a02a with SMTP id 38308e7fff4ca-36d1680af25mr6257791fa.3.1758659825164; Tue, 23 Sep 2025 13:37:05 -0700 (PDT) MIME-Version: 1.0 From: Samuel Marks Date: Tue, 23 Sep 2025 15:36:53 -0500 X-Gm-Features: AS18NWAGXqS2KdvpXLdiPBA3i1vqS-h1_B6qVsqCGPI8Yx-Hl_JSR_PN-ICES8w Message-ID: Subject: How do I upsert depending on a second table? To: 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 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