Re: Fast AT ADD COLUMN with DEFAULTs
От | Vitaly Burovoy |
---|---|
Тема | Re: Fast AT ADD COLUMN with DEFAULTs |
Дата | |
Msg-id | CAKOSWNmtxsWHYFtk4O2XSE1NGNMDguZOwuByC=P51pbRBj=grQ@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: Fast AT ADD COLUMN with DEFAULTs (Andres Freund <andres@anarazel.de>) |
Список | pgsql-hackers |
On 10/5/16, Andres Freund <andres@anarazel.de> wrote: > On 2016-10-05 15:44:56 -0700, Jeff Janes wrote: >> On Wed, Oct 5, 2016 at 3:29 PM, Andres Freund <andres@anarazel.de> wrote: >> > ALTER TABLE foo ALTER COLUMN withdefault DROP DEFAULT; >> > INSERT id = 1; >> > ALTER TABLE foo ALTER COLUMN withdefault SET DEFAULT 1; >> > ALTER TABLE foo ALTER COLUMN withdefault DROP DEFAULT; >> > INSERT id = 2; >> > ALTER TABLE foo ALTER COLUMN withdefault SET DEFAULT 2; >> > ALTER TABLE foo ALTER COLUMN withdefault DROP DEFAULT; >> > INSERT id = 3; >> > ALTER TABLE foo ALTER COLUMN withdefault SET DEFAULT 3; >> > >> > The result here would be that there's three rows with a default value >> > for foo that's the same as their id. None of them has that column >> > present in the row. >> > >> >> My understanding is that all of those would be materialized. > > But that'd require a table rewrite, as none of the above INSERTs were > done when a default was in place. Since they did not have the default value, that tuples are written with actual TupleDesc.natts where att_isnull for "withdefault" column is set (actually the column does not have default for inserted tuples in your case). > But each has a different "applicable" default value. No, their values are constructed "from scratch", not fetched from a heap, so "pre-alter-add-column" default is not applicable for them. >> The only >> default that isn't materialized is the one in effect in the same >> statement >> in which that column was added. Since a column can only be added once, >> the >> default in effect at the time the column was added can never change, no >> matter what you do to the default later on. > > DROP DEFAULT pretty much does that, because it allows multiple (set of) > rows with no value (or a NULL) for a specific column, but with differing > applicable default values. DROP DEFAULT is for "post-alter-add-column" tuples, it does not affects "pre-alter-add-column" ones. -- Best regards, Vitaly Burovoy
В списке pgsql-hackers по дате отправления: