Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oObRh-0004yF-UQ for pgsql-hackers@arkaria.postgresql.org; Thu, 18 Aug 2022 09:04:10 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1oObRg-0004nZ-N2 for pgsql-hackers@arkaria.postgresql.org; Thu, 18 Aug 2022 09:04:08 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oObRf-0004nP-Su for pgsql-hackers@lists.postgresql.org; Thu, 18 Aug 2022 09:04:08 +0000 Received: from wout3-smtp.messagingengine.com ([64.147.123.19]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oObRZ-0006YG-49 for pgsql-hackers@lists.postgresql.org; Thu, 18 Aug 2022 09:04:06 +0000 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.west.internal (Postfix) with ESMTP id 9B6053200A42; Thu, 18 Aug 2022 05:03:56 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute4.internal (MEProxy); Thu, 18 Aug 2022 05:03:56 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:reply-to:sender :subject:subject:to:to:x-me-proxy:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm1; t=1660813436; x=1660899836; bh=4 JsURVK8vc+hD6WbMemo/s5e4wOVNHNQeD5rBfkHji4=; b=vb3B2oyfd8ILClCSX vxY9DcqRUSwc80dophz1sjoi7Za5DIf4hZA6KKH86O7p415l7CPC+p9+3h0kSHQ+ UaZ9RydccnEEAn7/UOiPJckBo5fVTD5qjoz2ujl7ptMPhwTDQAAQMvHknBxLrJ66 gJ8kGtFjL0rsS8Pkvo5epCClWRlkISjOmcZCZOLj0UsYIoxi0k7e/kXZD8rpjgP5 jLlCt8qUZq8asWgXQAoiYDrWUqo7nwTZ3IAPGPTbIvgfoo0qyq+KRhfffaasQxsr QurGqYVqco2aiYLdrcpRiT2RIILvjaABjA8G0aJzTHvdmz/m34QlFlpGm19P7JET tDaxA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvfedrvdehkedgudefucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhepfffhvfevuffkgggtugfgjgesthekredttddtjeenucfhrhhomheptehlvhgr rhhoucfjvghrrhgvrhgruceorghlvhhhvghrrhgvsegrlhhvhhdrnhhoqdhiphdrohhrgh eqnecuggftrfgrthhtvghrnheptddukeduteeufeevvdeufeelteeifeeijeekteetkeek vedtudduieetjefggfetnecuffhomhgrihhnpegvnhhtvghrphhrihhsvggusgdrtghomh dphhgrthgvshdqshhofhhtfigrrhgvrdgtohhmnecuvehluhhsthgvrhfuihiivgeptden ucfrrghrrghmpehmrghilhhfrhhomheprghlvhhhvghrrhgvsegrlhhvhhdrnhhoqdhiph drohhrgh X-ME-Proxy: Feedback-ID: ia2694551:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 18 Aug 2022 05:03:55 -0400 (EDT) Received: by perhan.alvh.no-ip.org (Postfix, from userid 1000) id 04E16373; Thu, 18 Aug 2022 11:04:26 +0200 (CEST) Date: Thu, 18 Aug 2022 11:04:25 +0200 From: Alvaro Herrera To: Laurenz Albe Cc: Pg Hackers Subject: Re: cataloguing NOT NULL constraints Message-ID: <20220818090425.37co7pfwysbervgj@alvherre.pgsql> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On 2022-Aug-18, Laurenz Albe wrote: > On Wed, 2022-08-17 at 20:12 +0200, Alvaro Herrera wrote: > > 1. In my implementation, you can have more than one NOT NULL > >    pg_constraint row for a column.  What should happen if the user does > >    ALTER TABLE .. ALTER COLUMN .. DROP NOT NULL; > >    ?  Currently it throws an error about the ambiguity (ie. which > >    constraint to drop). > > I'd say that is a good solution, particularly if there is a hint to drop > the constraint instead, similar to when you try to drop an index that > implements a constraint. Ah, I didn't think about the hint. I'll add that, thanks. > >    Using ALTER TABLE DROP CONSTRAINT works fine, and the 'attnotnull' > >    bit is lost when the last one such constraint goes away. > > Wouldn't it be the correct solution to set "attnotnumm" to FALSE only > when the last NOT NULL constraint is dropped? ... when the last NOT NULL or PRIMARY KEY constraint is dropped. We have to keep attnotnull set when a PK exists even if there's no specific NOT NULL constraint. > > 2. If a table has a primary key, and a table is created that inherits > >    from it, then the child has its column(s) marked attnotnull but there > >    is no pg_constraint row for that.  This is not okay.  But what should > >    happen? > > > >    1. a CHECK(col IS NOT NULL) constraint is created for each column > >    2. a PRIMARY KEY () constraint is created > > I think it would be best to create a primary key constraint on the > partition. Sorry, I wasn't specific enough. This applies to legacy inheritance only; partitioning has its own solution (as you say: the PK constraint exists), but legacy inheritance works differently. Creating a PK in children tables is not feasible (because unicity cannot be maintained), but creating a CHECK (NOT NULL) constraint is possible. I think a PRIMARY KEY should not be allowed to exist in an inheritance parent, precisely because of this problem, but it seems too late to add that restriction now. This behavior is absurd, but longstanding: 55432 16devel 1787364=# create table parent (a int primary key); CREATE TABLE 55432 16devel 1787364=# create table child () inherits (parent); CREATE TABLE 55432 16devel 1787364=# insert into parent values (1); INSERT 0 1 55432 16devel 1787364=# insert into child values (1); INSERT 0 1 55432 16devel 1787364=# select * from parent; a ─── 1 1 (2 filas) -- Álvaro Herrera Breisgau, Deutschland — https://www.EnterpriseDB.com/ "But static content is just dynamic content that isn't moving!" http://smylers.hates-software.com/2007/08/15/fe244d0c.html