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 1v19zf-005ANA-7t for pgsql-general@arkaria.postgresql.org; Tue, 23 Sep 2025 20:52:11 +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 1v19zd-007zsS-KL for pgsql-general@arkaria.postgresql.org; Tue, 23 Sep 2025 20:52:09 +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 1v19zc-007zsK-Im for pgsql-general@lists.postgresql.org; Tue, 23 Sep 2025 20:52:09 +0000 Received: from fout-b1-smtp.messagingengine.com ([202.12.124.144]) by makus.postgresql.org with smtp (Exim 4.96) (envelope-from ) id 1v19za-0023uD-0L for pgsql-general@lists.postgresql.org; Tue, 23 Sep 2025 20:52:07 +0000 Received: from phl-compute-03.internal (phl-compute-03.internal [10.202.2.43]) by mailfout.stl.internal (Postfix) with ESMTP id 1008B1D002E1; Tue, 23 Sep 2025 16:52:05 -0400 (EDT) Received: from phl-mailfrontend-01 ([10.202.2.162]) by phl-compute-03.internal (MEProxy); Tue, 23 Sep 2025 16:52:05 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aklaver.com; h= cc:content-transfer-encoding:content-type:content-type:date:date :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to; s=fm3; t=1758660724; x=1758747124; bh=03gZCiVPXovKjBBhKgRKQH2+4Rr5ciOI1zA4jwWEFw8=; b= ZkyjLEE0vQDZB1PYJ8XnMds0EbzGkychdHJoJ91FQ8ipbil0rXmWekKZaU5crd8A y6SNqLmdIo0kZ4UEhwg/ZqF2ZbU/2B9jDk/e83d5N+CmrsH1wWSh8ulOx6Zt0crN rFvxltfx+1GbycwNJCLlVl60IEfs3qre3pnEWy45w0idZPQI+c1RuYfBFYOBMA7B ndQ4qWezQcRdvSkd+nF6pk9ppV+4PIOwxdAy+aMnnMuOd3oo94KSQE0WMtKfHz6B RcpL5LY0sRRc9/9rB+SExV6GPR4e21btuRO0S7CMzCcaTYR/RWduOC2CtqLVo5dX su7MmeMarM9GobJmV/IN5g== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:content-type :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm1; t=1758660724; x=1758747124; bh=0 3gZCiVPXovKjBBhKgRKQH2+4Rr5ciOI1zA4jwWEFw8=; b=QPXxbw2cm1DLNFS/V F5STL935gzRgl3rxkfLqS4Bmx177VLS61C8/LDrTk+ryuhjDYyd1l89LKEy52BKJ nIfFtSlM9M78tNO+ZmSBy1EdoYih3riayD5oJ6ebZH8TWixyNKuLISgoSumuuQEb vWW12DX7iVUUoLpkUufwH2F3J63Qb6uVETTepoHuRAUO3aaBcSZ14px4n+MRDF39 KVv3bDhesFgNduC5upiWIOeoYOOe1rz2fYbxbN6F/D+G36UALB2eIIgoxQLKSJaK pI5l5XUYQrGn8I2Yjtc6NECwijAT0LJ4z4JtWbkTTUCOzqQ+ddR4REskGsaOur36 T8z1w== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdeggdeiudejgecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpuffrtefokffrpgfnqfghnecuuegr ihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenucfjug hrpefkffggfgfuvfhfhfgjtgfgsehtkeertddtvdejnecuhfhrohhmpeetughrihgrnhcu mfhlrghvvghruceorggurhhirghnrdhklhgrvhgvrhesrghklhgrvhgvrhdrtghomheqne cuggftrfgrthhtvghrnhepffelgeeifefgveduhedthfekuedtffejveegffegjeevtdeh gfduieetfeehjeehnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilh hfrhhomheprggurhhirghnrdhklhgrvhgvrhesrghklhgrvhgvrhdrtghomhdpnhgspghr tghpthhtohepvddpmhhouggvpehsmhhtphhouhhtpdhrtghpthhtohepshgrmhhuvghlmh grrhhkshesghhmrghilhdrtghomhdprhgtphhtthhopehpghhsqhhlqdhgvghnvghrrghl sehlihhsthhsrdhpohhsthhgrhgvshhqlhdrohhrgh X-ME-Proxy: Feedback-ID: i76984098:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Tue, 23 Sep 2025 16:52:04 -0400 (EDT) Message-ID: Date: Tue, 23 Sep 2025 13:52:03 -0700 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: How do I upsert depending on a second table? To: Samuel Marks , pgsql-general@lists.postgresql.org References: Content-Language: en-US From: Adrian Klaver In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On 9/23/25 13:36, Samuel Marks wrote: > 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 = EXCLUDED.full_name, > org = EXCLUDED.org > WHERE EXISTS (SELECT 1 > FROM org org_tbl > WHERE org_tbl.name = EXCLUDED.org > AND org_tbl.owner = 'wrong user') Where is org_tbl? Or is this a copy and paste error? > RETURNING *; > > SELECT * FROM repo WHERE id = 0; > ``` > > This all succeeds. It should fail because the 'wrong user' is trying > to create a new—or update an existing—repo. > > Thanks for all suggestions > > -- Adrian Klaver adrian.klaver@aklaver.com