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 1tr0kU-00DTdp-88 for pgsql-general@arkaria.postgresql.org; Sat, 08 Mar 2025 20:26:18 +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 1tr0kR-008B1F-Mg for pgsql-general@arkaria.postgresql.org; Sat, 08 Mar 2025 20:26:15 +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 1tr0kR-008Azh-9u for pgsql-general@lists.postgresql.org; Sat, 08 Mar 2025 20:26:15 +0000 Received: from mail-ej1-x62e.google.com ([2a00:1450:4864:20::62e]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1tr0kP-001jZ0-0A for pgsql-general@lists.postgresql.org; Sat, 08 Mar 2025 20:26:14 +0000 Received: by mail-ej1-x62e.google.com with SMTP id a640c23a62f3a-ac2400d1c01so507629366b.1 for ; Sat, 08 Mar 2025 12:26:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cybertec.at; s=google; t=1741465571; x=1742070371; darn=lists.postgresql.org; h=mime-version:user-agent:content-transfer-encoding:references :in-reply-to:date:to:from:subject:message-id:from:to:cc:subject:date :message-id:reply-to; bh=LDG/0Q9KhNXnBKdOBBQwF32H0RpSo85FRQGy2y6SYqY=; b=DfO0yp/N0K6kfjEGMXgxRsMPYeIEqFnMM+awriyM+cCXiWqWPnWLqzHGwQra1NgIsc ImestJYofmgtwCmTy4GFCaxOyq73ojKoWnA1RAxkN1RdAaHfl3oHyVSa1E0zdxvyqRHU qAhUu0jE5qSFRvQMjb/f5dHDTkH4COSx77hR5QkXXdKSmwgxVYL5qmyefY9l9f4Pnvte Nhj7SkbtzEULSA2XuHRl3MCnzgTNe5VIn0poZoJBeMjtVc3lRTEeHLb/LAGrvv51DClR vPm9qxl+2pROgKWBLAMFVp9xDfjWzGvum4zp1H/ymBs3Sx2jVpqen2zUQyaNZC7mtdlL Yd0Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741465571; x=1742070371; h=mime-version:user-agent:content-transfer-encoding:references :in-reply-to:date:to:from:subject:message-id:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=LDG/0Q9KhNXnBKdOBBQwF32H0RpSo85FRQGy2y6SYqY=; b=FwIK4UXBR+QdgYpfLLiJrEC5UAC+hszJGRf5F7GBbSwg1OkrwwU0loiSCpwe/6GWmH htZEw34wpvco2BhWS11DB51W0+I3iW8NFOeoWqN+UWW/0LZf76FB49RV7DzvjekQc3jJ H4yx3e5T7048AXS0+VXS/DekrPwsnVUDcW3B6MTNhlXB+pnUvvRU7zl2pT93XM0/A3wN vasZyDTJGbP+oymGO91uSmStSXgcmegRL6laOM5ay/FW3qw7PePJnUazF+XFRuoLTglF gltN3J6/NBOh329W3iioV7hqjh5Vl4MubHRTNxcpUX1kETevTLHdX0aZLPye+95BTBMk SFKA== X-Forwarded-Encrypted: i=1; AJvYcCUCdFUY1R2dUjSEvsfrvmhn8NXaQqIuZWGjO0OkhyvrjXG1ftP+Sc/ss8ln/dl10Nm8Q9hNg15/8lqLXbCd@lists.postgresql.org X-Gm-Message-State: AOJu0YwprGrYpGLF1Tn1ulQdj1fgf0lx9W+i+2wRGvysC86ydkq1zWSb 3gbAkUhvWMEQ7HwxBoyDGik74Wa7u7Z11ztU5DYi11zQyYAqxPoF/nr8yG+b22w= X-Gm-Gg: ASbGncuSqDa02VmrycLXA+1grXZS4A1K/4NWVOhgcJbXVgdJpPfSTgHhy2OdVXtQVic oVHCucbnX/eitG1x7TS2ZHuHtXQa/8FktTMkRTlDeTEG5C56NiZ4br2+A5LMCxEPTMQtcGU4a18 4MXBeCj6FlUTJyR5+4vKPOfesIgmXca+7yFboRfU3MYtaIi2XRbM+pHfaU0vAo6A045KD9Xk/nf WnFVSpR+b4Yex2Wc+9Lerx/2LAmmutLyvBPCqgX6IG7MDdNjAaX5nyHuG1fY8yadwiH5Mulelm4 XhFF8sO8pTWMNdcxLONdKI5X3ECacty0uwd50Z4u8r50wHXfuoKChlrQx57z2xSKCw== X-Google-Smtp-Source: AGHT+IGUeJrGIrqEMLTtBE/2tyzZ8CwoCBZmiXkP6SrvbA41U6DYolIOXVtm4h741lIhS8r43YSxFA== X-Received: by 2002:a17:907:c31c:b0:abf:6e87:5148 with SMTP id a640c23a62f3a-ac26cc6c10bmr472456866b.23.1741465570435; Sat, 08 Mar 2025 12:26:10 -0800 (PST) Received: from localhost.localdomain ([2001:871:260:1b24:b8d0:da60:28ff:a328]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ac239437fb2sm492090466b.17.2025.03.08.12.26.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Mar 2025 12:26:10 -0800 (PST) Message-ID: <56afabfed80a7da28bec5a9cf12cce853fc02c3f.camel@cybertec.at> Subject: Re: exclusion constraint question From: Laurenz Albe To: "Rhys A.D. Stewart" , pgsql-general@lists.postgresql.org Date: Sat, 08 Mar 2025 21:26:09 +0100 In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable User-Agent: Evolution 3.54.3 (3.54.3-1.fc41) MIME-Version: 1.0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On Sat, 2025-03-08 at 14:01 -0500, Rhys A.D. Stewart wrote: > I have the following table: >=20 > CREATE TABLE shelves( > =C2=A0=C2=A0=C2=A0 shelf_id bigint PRIMARY KEY, > =C2=A0=C2=A0=C2=A0 l_mug_id bigint UNIQUE, > =C2=A0=C2=A0=C2=A0 c_mug_id bigint UNIQUE, > =C2=A0=C2=A0=C2=A0 r_mug_id bigint UNIQUE, > =C2=A0=C2=A0=C2=A0 CHECK (l_mug_id <> c_mug_id AND l_mug_id <> r_mug_id A= ND c_mug_id > <> r_mug_id), > =C2=A0=C2=A0=C2=A0 EXCLUDE USING gist (l_mug_id WITH <>, c_mug_id WITH <>= , r_mug_id > WITH <>) -- Not working as expected (or my expectations are wrong). > ); >=20 > And some data: >=20 > INSERT INTO shelves VALUES (1,=C2=A0=C2=A0=C2=A0 7,=C2=A0=C2=A0=C2=A0 2,= =C2=A0=C2=A0=C2=A0 1); > INSERT INTO shelves VALUES (2,=C2=A0=C2=A0=C2=A0 3, null, null); > INSERT INTO shelves VALUES (3, null,=C2=A0=C2=A0=C2=A0 1,=C2=A0=C2=A0=C2= =A0 4); > INSERT INTO shelves VALUES (4,=C2=A0=C2=A0=C2=A0 4,=C2=A0=C2=A0=C2=A0 5, = null); >=20 > Mugs on shelves, fascinating. A mug_id can only appear once in the > entire table. The check constraint handles not having the same mug_id > in each row and the unique constraints does the same for the column. > But how do I get around checking multiple columns for the same mug_id. > I'm thinking an exclusion constraint, but (a) I do not know if I am > overthinking it and (b) the exclusion constraint I have does not work > as expected, or my expectations are way off. >=20 > Any suggestions would be appreciated. I believe that this can only be solved by keeping a tally of the used mugs in a second table that is maintained by a trigger. Yours, Laurenz Albe