eu queria saber sobre esse exemplo
CREATE TABLE cities (
city varchar(80) primary key,
location point
);
CREATE TABLE weather (
city varchar(80) references cities(city),
temp_lo int,
temp_hi int,
prcp real,
date date
);
A definição de city
como varchar(80)
é duplicada aqui. Existe uma sintaxe do PostgreSQL que permita não duplicar varchar(80)
, apenas se baseando references cities(city)
para criar a tabela meteorológica?
Não há como fazer isso. E, francamente, não vejo necessidade.
Lembre-se de que as colunas referenciadas e de referência não precisam compartilhar o mesmo tipo de dados. Eles só precisam ter um
=
operador definido entre eles.Se seu objetivo é encurtar a sintaxe, você pode omitir a coluna (ou lista de colunas) da(s) coluna(s) referenciada(s) se for o PK:
O tipo de dados no exemplo é compatível, mas não é o mesmo (
text
vs.varchar(80)
), a coluna referenciada é considerada a chave primária da tabelacities
.Cito o manual em
CREATE TABLE
:Você pode evitar a duplicação da definição de tipo, mas o SQL não deduzirá o tipo a ser usado lendo o tipo de uma referência de chave estrangeira.
A maneira padrão do SQL
CREATE DOMAIN
permite criar um domínio (duh) que os documentos descrevem como "essencialmente um tipo de dados com restrições opcionais".Então, no seu caso, você poderia fazer algo assim.
Em seguida, na definição da tabela, você pode usar CITY_NAME em vez de varchar(80).
O PostgreSQL também suporta restrições CHECK() como parte da instrução CREATE DOMAIN.
Se a definição precisar ser alterada, você pode despejar os dados, alterar a instrução CREATE DOMAIN em um local, descartar o banco de dados, reconstruir o esquema e recarregar os dados. Não acho que você possa alterar um domínio que está em uso, mas posso estar errado. Eu só tive que fazer isso três ou quatro vezes em 30 anos.
A maneira codegeek fora do padrão
A linguagem C possui um pré-processador. Os idiomas que não possuem um pré-processador podem usar m4 .
m4 oferece mais flexibilidade do que CREATE DOMAIN do SQL, mas tem um escopo mais amplo. Às vezes isso é uma coisa boa, e às vezes não é. A diferença mais importante é que o m4 procurará um token como "CITY_NAME" em todos os lugares, não apenas nos locais onde uma declaração de tipo de dados é esperada. Uma convenção de nomenclatura cuidadosamente considerada ajuda muito.
Defina uma macro e sua substituição. Em seguida, escreva suas instruções CREATE TABLE como acima.
Ao executar isso através de m4, você deve obter uma instrução CREATE TABLE que tenha "varchar(80)" no lugar de "CITY_NAME", assim.