Can't delete Null value from a not null field

Started by Bryan Whitealmost 26 years ago2 messagesgeneral
Jump to latest
#1Bryan White
bryan@arcamax.com

I have a very simple table defined as
CREATE TABLE custlist (
listid int4 NOT NULL,
custid int4 NOT NULL);

Somehow a record has gotten into the table with both values null. When I
try to delete using
delete from custlist where custid is null;
or
delete from custlist where listid is null;
I get the output:
ERROR: ExecutePlan: (junk) `ctid' is NULL!
I get the same error if I try to update the null row.

At this point I figured I would outsmart it and use the oid. However it
appears the oid is null as well.

Any suggestions? At this point the only thing I can see to do is dump the
table and run the dump through a filter for the bad record and then reload
it.

This is all being done on 6.5.3.

BTW the database is dumped and loaded onto a backup machine nightly. The
load of this table is failing because of the null row.

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bryan White (#1)
Re: Can't delete Null value from a not null field

"Bryan White" <bryan@arcamax.com> writes:

I get the output:
ERROR: ExecutePlan: (junk) `ctid' is NULL!
I get the same error if I try to update the null row.
At this point I figured I would outsmart it and use the oid. However it
appears the oid is null as well.

Wow, that's bizarre. It shouldn't be *possible* for oid or ctid to be
null --- AFAIK they don't have a null-value bit. There must be
something really hosed up about that tuple's header.

Any suggestions? At this point the only thing I can see to do is dump the
table and run the dump through a filter for the bad record and then reload
it.

Slightly faster than a dump and reload:

RENAME broken table to something else;

CREATE TABLE new-table;

INSERT INTO new-table SELECT * FROM broken-table WHERE custid IS NOT NULL;

then recreate the indexes wanted on new-table...

regards, tom lane