[GENERAL] foreign key with char and varchar - Mailing list pgsql-general

From Thomas Poty
Subject [GENERAL] foreign key with char and varchar
Date
Msg-id CAN_ctng6cBVZgaU6hzVzcRHdvTmQfHx4HA4ZrzLoZZRo7HVejQ@mail.gmail.com
Whole thread Raw
Responses Re: [GENERAL] foreign key with char and varchar  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-general
Hi world,

I wanted to test if char and varchar can be cross-referenced as foreign key. So i did these tests :

1) Can a varchar(7) reference a char(2) ? PostgreSQL accepts it
create table t1 (id char(2) primary key, data text);
create table t2 (id char(2) primary key, data text, id_t1 varchar(7) references t1 (id));

2) Can a varchar(7) reference a char(7) ? PostgreSQL accepts it
create table t3 (id char(7) primary key, data text);
create table t4 (id char(7) primary key, data text, id_t3 varchar(7) references t3 (id));

3) Can a char(2) reference a varchar(7) ? PostgreSQL accepts it.
create table t5 (id varchar(7) primary key, data text);
create table t6 (id char(7) primary key, data text, id_t5 char(2) references t5 (id));

3.1) I am very surprised to be able do that :
 -> insert into t5 (id,data) values ('1','toto');
     It works that is normal
 -> insert into t6 (id,data,id_t5) values ('1','toto','1');
    It works and it is a suprise by knowing char are padded with spaces so PostgreSQL would  compare '1' with '1 ' ( 1 with a space) and return false.
    Can you explain why it is working ???

3.2) I am very surprised to be able do that :
->  insert into t5 (id,data) values ('2 ','tata');
     It works and it is normal
 > insert into t6 (id,data,id_t5) values ('2','tata','2');
    ERROR:  insert or update on table "t6" violates foreign key constraint "t6_id_t5_fkey"
    DETAIL:  Key (id_t5)=(2 ) is not present in table "t5".
    It works and it is a suprise by knowing char are padded with spaces so PostgreSQL would  compare '2 ' with '2 ' ( 2 with a space) and return true.
    Can you explain why it is working ???

4) Can a char(7) reference a varchar(7) ? PostgreSQL accepts it
create table t7 (id varchar(7) primary key, data text);
create table t8 (id varchar(7) primary key, data text, id_t7 char(7) references t7 (id));


I thought the columns referring and referenced had to be the same data type with the same length but it seems not to be the case.

Thanks for answers

Thomas

pgsql-general by date:

Previous
From: Julien Rouhaud
Date:
Subject: Re: [GENERAL] pg_stat_statements -- Historical Query
Next
From: Melvin Davidson
Date:
Subject: Re: [GENERAL] pg_stat_statements -- Historical Query