Null option and Default value Lost when use CREATE TABLE AS to backup a table.

Started by Xiao, Bing (Benny)over 4 years ago3 messagesbugs
Jump to latest
#1Xiao, Bing (Benny)
bing.xiao@dxc.com

Hi Team,

Null option(NOT NULL) and Default value lost when I try to copy a table with CREATE TABLE AS statement.

List the test step as below.

1. PostgreSQL version.

[cid:image005.jpg@01D7C682.25FBB520]

1. Create test table as below.

CREATE TABLE contact(

id SERIAL PRIMARY KEY,

first_name VARCHAR NOT NULL DEFAULT 'Benny',

last_name VARCHAR NOT NULL,

email VARCHAR NOT NULL UNIQUE

);

1. Insert the test data to table Contact.

INSERT INTO contact(first_name, last_name, email)

VALUES('John','Doe','john.doe@postgresqltutorial.com'),

('David','William','david.william@postgresqltutorial.com');

1. Create back up table.

create table contact_bckp as table contacts with data;

1. Test to insert data with null in column last_name. Failed in table contact.

INSERT INTO contact(first_name, last_name, email) VALUES('benny',null,'john.doe@postgresqltutorial.com');

[cid:image011.jpg@01D7C682.25FBB520]

1. Test to insert data with null in column last_name. Succeed in table contact_bckp. And even the PK column been set to null.

INSERT INTO contact_bckp(first_name, last_name, email) VALUES('benny',null,'john.doe@postgresqltutorial.com');

[cid:image012.jpg@01D7C682.25FBB520]

[cid:image013.jpg@01D7C682.25FBB520]

1. Check the table definition as below. contact_bckp lost null option and default value compare to table contact.

[cid:image014.jpg@01D7C682.25FBB520]

[cid:image018.jpg@01D7C682.25FBB520]

Best Regards.
Benny
Email: bing.xiao@dxc.com<mailto:bing.xiao@dxc.com>

Attachments:

image013.jpgimage/jpeg; name=image013.jpgDownload
image014.jpgimage/jpeg; name=image014.jpgDownload
image018.jpgimage/jpeg; name=image018.jpgDownload
image005.jpgimage/jpeg; name=image005.jpgDownload
image011.jpgimage/jpeg; name=image011.jpgDownload
image012.jpgimage/jpeg; name=image012.jpgDownload+1-0
#2Vik Fearing
vik@postgresfriends.org
In reply to: Xiao, Bing (Benny) (#1)
Re: Null option and Default value Lost when use CREATE TABLE AS to backup a table.

On 10/21/21 7:47 AM, Xiao, Bing (Benny) wrote:

1. Create back up table.

create table contact_bckp as table contacts with data;

This is not the correct way to do this. Do it this way instead:

BEGIN;
CREATE TABLE contact_bckp (LIKE contacts INCLUDING ALL);
INSERT INTO contact_bckp TABLE contacts;
COMMIT;
--
Vik Fearing

#3Francisco Olarte
folarte@peoplecall.com
In reply to: Xiao, Bing (Benny) (#1)
Re: Null option and Default value Lost when use CREATE TABLE AS to backup a table.

Seems like wrong command used.
On Thu, 21 Oct 2021 at 12:18, Xiao, Bing (Benny) <bing.xiao@dxc.com> wrote:

Create back up table.
create table contact_bckp as table contacts with data;

"Create table as" needs a select query. "table contacts" is just a
fancy way of saying "select * from contacts". Create table as uses a
query result to create, query results do not have constraints. It is
easier to see why if you replace "table contacts" with its
"expansion".

From the two different commands ( quoting the manual ).

CREATE TABLE — define a new table
CREATE TABLE AS — define a new table from the results of a query

You are using the second, you need the first, look specifically at the
LIKE options:

LIKE source_table [ like_option ... ]
The LIKE clause specifies a table from which the new table
automatically copies all column names, their data types, and their
not-null constraints.

And then copy the data with an insert/select ( I do not remember now
if you can do it in one step, I always do it in two ).

So, IMHO, not a bug, working as it should.

Francisco Olarte.