CREATE TABLE

Nome

CREATE TABLE -- cria uma tabela

Sinopse

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE nome_da_tabela (
  { nome_da_coluna tipo_de_dado [ DEFAULT expressão_padrão ] [ restrição_de_coluna [ ... ] ]
    | restrição_de_tabela
    | LIKE tabela_ancestral [ { INCLUDING | EXCLUDING } DEFAULTS ] }  [, ... ]
)
[ INHERITS ( tabela_ancestral [, ... ] ) ]
[ WITH OIDS | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]

onde restrição_de_coluna é:

[ CONSTRAINT nome_da_restrição ]
{ NOT NULL | NULL | UNIQUE | PRIMARY KEY | CHECK (expressão) |
  REFERENCES tabela_referenciada [ ( coluna_referenciada ) ]
    [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
    [ ON DELETE ação ] [ ON UPDATE ação ] }
    [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

e restrição_de_tabela é:

[ CONSTRAINT nome_da_restrição ]
{ UNIQUE ( nome_da_coluna [, ... ] ) |
  PRIMARY KEY ( nome_da_coluna [, ... ] ) |
  CHECK ( expressão ) |
  FOREIGN KEY ( nome_da_coluna [, ... ] )
    REFERENCES tabela_referenciada [ ( coluna_referenciada [, ... ] ) ]
    [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE ação ] [ ON UPDATE ação ] }
    [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

Descrição

O comando CREATE TABLE cria uma tabela, inicialmente vazia, no banco de dados corrente. O usuário que executa o comando se torna o dono da tabela. [1]

Se o nome do esquema for fornecido (por exemplo, CREATE TABLE meu_esquema.minha_tabela ...) então a tabela é criada no esquema especificado, senão é criada no esquema corrente. As tabelas temporárias são criadas em um esquema especial e, portanto, o nome do esquema não pode ser especificado ao se criar tabelas temporárias. O nome da tabela deve ser distinto do nome de qualquer outra tabela, seqüência, índice ou visão no mesmo esquema.

O comando CREATE TABLE também cria, automaticamente, o tipo de dado que representa o tipo composto correspondente a uma linha da tabela. Portanto, as tabelas não podem ter o mesmo nome de um tipo de dado existente no mesmo esquema.

Uma tabela não pode ter mais de 1600 colunas (Na prática o limite efetivo é menor, por causa da restrição do comprimento das tuplas).

As cláusulas de restrição opcionais especificam as restrições (ou testes) que as linhas novas ou modificadas devem satisfazer para a operação de inserção ou de modificação ser aceita. Uma restrição é um objeto SQL que ajuda a definir o conjunto de valores válidos para a tabela de várias maneiras.

Existem duas formas para definir restrições: restrições de tabela e restrições de coluna. A restrição de coluna é definida como parte da definição da coluna. A definição da restrição de tabela não é limitada a uma única coluna, podendo incluir mais de uma coluna. Toda restrição de coluna também pode ser escrita como restrição de tabela; a restrição de coluna é somente uma notação conveniente para ser usada quando a restrição afeta apenas uma coluna. [2]

Parâmetros

TEMPORARY ou TEMP
Se for especificado, a tabela é criada como sendo temporária. As tabelas temporárias são automaticamente removidas no final da sessão ou, opcionalmente, no fim da transação corrente (veja ON COMMIT abaixo). Tabelas permanentes existentes não serão visíveis na sessão corrente enquanto existirem tabelas temporárias com o mesmo nome, a não ser que sejam referenciadas por um nome qualificado pelo esquema. Todo índice criado em tabela temporária também é temporário. Opcionalmente, GLOBAL ou LOCAL podem ser escritos antes de TEMPORARY e de TEMP. Isto não faz qualquer diferença no PostgreSQL, mas veja Compatibilidade .
nome_da_tabela
O nome (opcionalmente qualificado pelo esquema) da tabela a ser criada.
nome_da_coluna
O nome da coluna a ser criada na nova tabela.
tipo_de_dado
O tipo de dado da coluna. Pode incluir especificadores de matriz (array).
DEFAULT expressão_padrão
A cláusula DEFAULT atribui um valor de dado padrão para a coluna em cuja definição está presente. O valor pode ser qualquer expressão sem variável (variable-free) (subconsultas e referências cruzadas para outras colunas da mesma tabela não são permitidas). O tipo de dado da expressão padrão deve corresponder ao tipo de dado da coluna. A expressão padrão é utilizada em todas as operações de inserção que não especificam valor para a coluna. Se não houver valor padrão para a coluna, então o valor padrão é o valor nulo.
LIKE tabela_ancestral [ { INCLUDING | EXCLUDING } DEFAULTS ]
A cláusula LIKE especifica a tabela da qual a nova tabela copia, automaticamente, todos os nomes de coluna, seus tipos de dado, e restrições de não-nulo. Ao contrário do INHERITS, a nova tabela e a tabela original ficam completamente separadas após o término da criação. Os dados inseridos na nova tabela não são refletidos na tabela ancestral. As expressões de valor padrão, existentes nas definições das colunas, somente são copiadas quando se especifica INCLUDING DEFAULTS. O padrão é não copiar as expressões de valor padrão.
INHERITS ( tabela_ancestral [, ... ] )
A cláusula opcional INHERITS (herda) especifica uma lista de tabelas das quais a nova tabela herda, automaticamente, todas as colunas. Se o mesmo nome de coluna existir em mais de uma tabela ancestral um erro é relatado, a menos que os tipo de dado das colunas seja o mesmo em todas as tabelas ancestrais. Não havendo conflito, então as colunas duplicadas são unidas para formar uma única coluna da nova tabela. Se a lista de nomes de colunas da nova tabela contiver um nome de coluna que também é herdado, da mesma forma o tipo de dado deve ser o mesmo das colunas herdadas, e a definição das colunas será unida em uma única coluna. Entretanto, declarações de colunas novas e herdadas com o mesmo nome não precisam especificar restrições idênticas: todas as restrições fornecidas em qualquer uma das declarações são unidas, sendo todas aplicadas à nova tabela. Se a nova tabela especificar, explicitamente, um valor padrão para a coluna, este valor padrão substitui o valor padrão das declarações herdadas. Não sendo assim, toda tabela ancestral que especificar um valor padrão para a coluna deve especificar o mesmo valor, ou um erro será relatado.
WITH OIDS
WITHOUT OIDS
Esta cláusula opcional especifica se as linhas da nova tabela devem possuir OIDs (identificadores de objeto) atribuídos. O padrão é possuir OIDs (Se a nova tabela herdar de alguma tabela que possua OIDs, então a cláusula WITH OIDS é forçada mesmo que no comando esteja especificado WITHOUT OIDS). A especificação de WITHOUT OIDS permite ao usuário suprimir a geração dos OIDs para as linhas da tabela. Este procedimento pode valer a pena em tabelas grandes, porque reduz o consumo de OIDs e, portanto, retarda o reinício do contador OID de 32 bits. Quando o contador reinicia, não é mais possível supor sua unicidade, reduzindo muito sua utilidade. A especificação de WITHOUT OIDS também reduz o espaço necessário para armazenar a tabela em disco em 4 bytes para cada linha da tabela e, portanto, melhora o desempenho.
CONSTRAINT nome_da_restrição
Um nome opcional para a restrição de coluna ou de tabela. Se não for especificado, o nome será gerado pelo sistema.
NOT NULL
A coluna não pode conter valores nulos.
NULL
A coluna pode conter valores nulos. Este é o padrão. Esta cláusula só está disponível para manter a compatibilidade com bancos de dados SQL fora do padrão. Sua utilização nas novas aplicações é desencorajada.
UNIQUE (restrição de coluna)
UNIQUE ( nome_da_coluna [, ... ] ) (restrição de tabela)
A restrição UNIQUE especifica que um grupo de uma ou mais colunas da tabela pode conter apenas valores únicos. O comportamento da restrição de unicidade de tabela é o mesmo da restrição de unicidade de coluna, mas com a capacidade adicional de envolver várias colunas. Para a finalidade de restrição de unicidade, valores nulos não são considerados iguais. Cada restrição de unicidade de tabela deve especificar um conjunto de colunas diferente do conjunto de colunas especificado por qualquer outra restrição de unicidade e, também, da chave primária definida para a tabela (Senão, seria apenas a mesma restrição declarada duas vezes).
PRIMARY KEY (restrição de coluna)
PRIMARY KEY ( nome_da_coluna [, ... ] ) (restrição de tabela)
A restrição de chave primária especifica que a coluna, ou colunas, da tabela podem conter apenas valores únicos (não duplicados) e não nulos. Tecnicamente a chave primária (PRIMARY KEY) é simplesmente uma combinação de unicidade (UNIQUE) com não nulo (NOT NULL), mas identificar um conjunto de colunas como chave primária também fornece metadados sobre o projeto do esquema, porque chaves primárias têm como conseqüência permitir que outras tabelas possam depender deste conjunto de colunas como identificador único para linhas. Somente pode ser especificada uma chave primária para cada tabela, seja como restrição de coluna ou como restrição de tabela. A restrição de chave primária deve especificar um conjunto de colunas diferente de outro conjunto de colunas especificado por uma restrição de unicidade definido para a mesma tabela.
CHECK (expressão)
A cláusula CHECK especifica uma expressão, que produz um resultado booleano, que as linhas novas ou atualizadas devem satisfazer para a operação de inserção ou de atualização ser bem-sucedida. Uma restrição de verificação especificada como uma restrição de coluna deve fazer referência somente ao valor desta coluna, enquanto uma expressão que aparece como uma restrição de tabela pode fazer referência a várias colunas. Atualmente as expressões CHECK não podem conter subconsultas, nem fazer referência a variáveis que não sejam colunas da linha corrente.
REFERENCES tabela_referenciada [ ( coluna_referenciada ) ] [ MATCH tipo_de_correspondência ] [ ON DELETE ação ] [ ON UPDATE ação ] (restrição de coluna)
FOREIGN KEY ( nome_da_coluna [, ... ] ) REFERENCES tabela_referenciada [ ( coluna_referenciada [, ... ] ) ] [ MATCH tipo_de_correspondência ] [ ON DELETE ação ] [ ON UPDATE ação ] (restrição de tabela)
Estas cláusulas especificam uma restrição de chave estrangeira, que requer que um grupo de uma ou mais colunas da nova tabela deva conter apenas valores correspondendo a valores nas colunas referenciadas de alguma linha da tabela referenciada. Se a coluna_referenciada for omitida, a chave primária da tabela_referenciada será utilizada. As colunas referenciadas devem ser colunas de uma restrição de unicidade ou de chave primária na tabela referenciada. Os valores inseridos nas colunas que fazem referência são comparados com os valores das colunas referenciadas da tabela referenciada utilizando o tipo de comparação especificado. Existem três tipos de comparação: MATCH FULL, MATCH PARTIAL e MATCH SIMPLE, que também é o padrão. MATCH FULL não permite uma coluna de uma chave estrangeira com várias colunas ser nula, a menos que todas as colunas da chave estrangeira sejam nulas. MATCH SIMPLE permite que algumas colunas da chave estrangeira sejam nulas, enquanto outras colunas da chave estrangeira não são nulas. MATCH PARTIAL ainda não está implementado. Além disso, quando os dados das colunas referenciadas são modificados, certas ações são realizadas nos dados das colunas desta tabela. A cláusula ON DELETE especifica a ação a ser realizada quando uma linha referenciada da tabela referenciada é excluída. Da mesma forma, a cláusula ON UPDATE especifica a ação a ser realizada quando uma coluna referenciada da tabela referenciada é atualizada para um novo valor. Se a linha for atualizada, mas a coluna referenciada não mudar de valor, nenhuma ação é executada. São possíveis as seguintes ações para cada cláusula:
NO ACTION
Produz um erro indicando que a exclusão ou a atualização cria uma violação da restrição de chave estrangeira. Esta é a ação padrão.
RESTRICT
O mesmo que NO ACTION, exceto que esta ação não será postergada mesmo que o restante da restrição for postergável e postergada.
CASCADE
Exclui qualquer linha que faça referência à linha excluída, ou atualiza o valor da coluna que faz referência para o novo valor da coluna referenciada, respectivamente.
SET NULL
Atribui o valor nulo às colunas que fazem referência.
SET DEFAULT
Atribui o valor padrão às colunas que fazem referência.

Se a coluna da chave primária for atualizada freqüentemente pode ser sensato adicionar um índice à coluna da chave estrangeira, para que as ações NO ACTION e CASCADE associadas com a coluna da chave estrangeira sejam realizadas de forma mais eficiente.

DEFERRABLE
NOT DEFERRABLE
Estas cláusulas controlam se a restrição pode ser postergada. Uma restrição que não pode ser postergada é verificada imediatamente após cada comando. A verificação das restrições postergáveis pode ser adiada para o final da transação (usando o comando SET CONSTRAINTS ). NOT DEFERRABLE é o padrão. Atualmente somente as restrições de chave estrangeira aceitam esta cláusula. Todos os outros tipos de restrição não são postergáveis.
INITIALLY IMMEDIATE
INITIALLY DEFERRED
Se uma restrição for postergável, esta cláusula especifica o instante padrão para verificar a restrição. Se a restrição for INITIALLY IMMEDIATE, então será verificada após cada instrução. Este é o padrão. Se a restrição for INITIALLY DEFERRED, então será verificada apenas no final da transação. O instante de verificação da restrição pode ser alterado pelo comando SET CONSTRAINTS .
ON COMMIT
O comportamento das tabelas temporárias ao término do bloco de transação pode ser controlado utilizando ON COMMIT. As três opções são:
PRESERVE ROWS
Nenhuma ação especial é realizada ao término da transação. Este é o comportamento padrão.
DELETE ROWS
Todas as linhas da tabela temporária são excluídas ao término de cada bloco de transação. Essencialmente, um TRUNCATE é feito após cada efetivação.
DROP
A tabela temporária é removida ao término do bloco de transação corrente.

Observações

Exemplos

Criar a tabela filmes e a tabela distribuidores:

CREATE TABLE filmes (
    cod_filme   char(5) CONSTRAINT pk_filmes PRIMARY KEY,
    titulo      varchar(40) NOT NULL,
    did         integer NOT NULL,
    data_prod   date,
    tipo        varchar(10),
    duracao     interval hour to minute
);

CREATE TABLE distribuidores (
     did    integer PRIMARY KEY DEFAULT nextval('serial'),
     nome   varchar(40) NOT NULL CHECK (nome <> '')
);

Criar uma tabela com uma matriz de 2 dimensões:

CREATE TABLE matriz2d_int (
    matriz  int[][]
);

Definir uma restrição de unicidade para a tabela filmes. Restrições de unicidade usando a sintaxe de restrição de tabela podem ser definidas envolvendo uma ou mais colunas da tabela.

CREATE TABLE filmes (
    cod_filme   char(5),
    titulo      varchar(40),
    did         integer,
    data_prod   date,
    tipo        varchar(10),
    duracao     interval hour to minute,
    CONSTRAINT  unq_data_prod UNIQUE(data_prod)
);

Definir uma restrição de verificação, usando a sintaxe de restrição de coluna:

CREATE TABLE distribuidores (
    did     integer CHECK (did > 100),
    nome    varchar(40)
);

Definir uma restrição de verificação, usando a sintaxe de restrição de tabela:

CREATE TABLE distribuidores (
    did     integer,
    nome    varchar(40)
    CONSTRAINT chk_dist CHECK (did > 100 AND nome <> '')
);

Definir uma restrição de chave primária, usando a sintaxe de restrição de tabela, para a tabela filmes. As restrições de chave primária com sintaxe de restrição de tabela podem ser definidas usando uma ou mais colunas da tabela.

CREATE TABLE filmes (
    cod_filme   char(5),
    titulo      varchar(40),
    did         integer,
    data_prod   date,
    tipo        varchar(10),
    duracao     interval hour to minute,
    CONSTRAINT  pk_filmes PRIMARY KEY(cod_filme,titulo)
);

Definir a restrição de chave primária para a tabela distribuidores. Os dois exemplos abaixo são equivalentes, o primeiro utiliza a sintaxe de restrição de tabela, e o segundo utiliza a sintaxe de restrição de coluna.

CREATE TABLE distribuidores (
    did     integer,
    nome    varchar(40),
    PRIMARY KEY(did)
);

CREATE TABLE distribuidores (
    did     integer PRIMARY KEY,
    nome    varchar(40)
);

O comando abaixo atribui uma constante literal como valor padrão para a coluna nome, faz o valor padrão da coluna did ser gerado pela seleção do próximo valor de um objeto de seqüência, e faz o valor padrão da coluna data_mod ser o momento em que a linha foi inserida.

CREATE TABLE distribuidores (
    nome      varchar(40) DEFAULT 'Luso Filmes',
    did       integer DEFAULT nextval('seq_distribuidores'),
    data_mod  timestamp DEFAULT current_timestamp
);

Definir duas restrições de coluna NOT NULL na tabela distribuidores, sendo que uma delas recebe um nome fornecido:

CREATE TABLE distribuidores (
    did     integer CONSTRAINT nao_nulo NOT NULL,
    nome    varchar(40) NOT NULL
);

Definir uma restrição de unicidade para a coluna nome:

CREATE TABLE distribuidores (
    did     integer,
    nome    varchar(40) UNIQUE
);

O comando acima é equivalente ao mostrado abaixo, especificado como uma restrição de tabela:

CREATE TABLE distribuidores (
    did     integer,
    nome    varchar(40),
    UNIQUE(nome)
);

Compatibilidade

O comando CREATE TABLE está em conformidade com o SQL-92 e com um subconjunto do SQL:1999, com as exceções listadas abaixo.

Tabelas temporárias

Embora a sintaxe de CREATE TEMPORARY TABLE se pareça com a do padrão SQL, o efeito não é o mesmo. No padrão as tabelas temporárias são definidas apenas uma vez, passando a existir automaticamente (começando com um conteúdo vazio) para todas as sessões que necessitarem destas. Em vez disso, o PostgreSQL requer que cada sessão execute seu próprio comando CREATE TEMPORARY TABLE para cada tabela temporária a ser utilizada, permitindo que sessões diferentes usem o mesmo nome de tabela temporária para finalidades diferentes, enquanto que a abordagem do padrão restringe todas as instâncias de um determinado nome de tabela temporária terem a mesma estrutura de tabela.

A definição do padrão para o comportamento de tabelas temporárias é amplamente ignorado. O comportamento do PostgreSQL neste ponto é semelhante ao de vários outros bancos de dado SQL.

A distinção feita pelo padrão entre tabelas temporárias globais e locais não está presente no PostgreSQL, uma vez que esta distinção depende do conceito de módulos, que o PostgreSQL não possui. Por motivo de compatibilidade, o PostgreSQL aceita as palavras chave GLOBAL e LOCAL na declaração da tabela temporária, mas estas não produzem efeito.

A cláusula ON COMMIT para as tabelas temporárias também lembra o padrão SQL, mas possui algumas diferenças. Se a cláusula ON COMMIT for omitida, o padrão SQL especifica que o comportamento padrão deve ser ON COMMIT DELETE ROWS. Entretanto, o comportamento padrão no PostgreSQL é ON COMMIT PRESERVE ROWS. A opção ON COMMIT DROP não existe no padrão SQL.

Restrições de verificação de coluna

O padrão SQL estabelece que as restrições de coluna CHECK só podem fazer referência à coluna onde estão aplicadas; somente a restrição CHECK de tabela pode fazer referência a várias colunas. O PostgreSQL não obriga o cumprimento desta restrição; as restrições de coluna e de tabela são tratadas da mesma maneira.

"Restrição" NULL

A "restrição" NULL (na verdade uma não restrição) é uma extensão do PostgreSQL ao padrão SQL incluída para manter a compatibilidade com alguns outros sistemas de banco de dados (e por simetria com a restrição NOT NULL). Uma vez que este é o padrão para qualquer coluna, sua presença é desnecessária.

Herança

Heranças múltiplas por meio da cláusula INHERITS é uma extensão do PostgreSQL à linguagem. O SQL:1999 (mas não o SQL-92) define herança única utilizando uma sintaxe diferente e semânticas diferentes. O estilo de herança do SQL:1999 ainda não é suportado pelo PostgreSQL.

Identificadores de Objeto (Object IDs)

O conceito de OIDs (identificadores de objeto) do PostgreSQL não é padrão.

Tabelas sem coluna

O PostgreSQL permite a criação de tabelas sem colunas (por exemplo, CREATE TABLE foo();). Isto é uma extensão ao padrão SQL, que não permite tabelas com zero coluna. As tabelas sem coluna não são muito úteis, mas se não forem permitidas criam um caso especial para o comando ALTER TABLE DROP COLUMN e, por isso, parece mais simples ignorar esta restrição contida na especificação.

Veja também

ALTER TABLE , DROP TABLE

Notas

[1]

A tabela é uma coleção ordenada de uma ou mais colunas e uma coleção não ordenada de zero ou mais linhas. Cada linha possui, para cada coluna, exatamente um valor do tipo de dado desta coluna. (ISO-ANSI Working Draft) Framework (SQL/Framework), August 2003, ISO/IEC JTC 1/SC 32, 25-jul-2003, ISO/IEC 9075-2:2003 (E) (N. do T.)

[2]

A restrição de tabela é uma restrição de integridade associada a uma única tabela base.

A restrição de tabela é uma entre restrição de unicidade, restrição de chave primária, restrição referencial ou restrição de verificação.

A restrição de unicidade especifica uma ou mais colunas da tabela como colunas únicas. A restrição de unicidade é satisfeita se, e somente se, não houverem duas linhas da tabela com os mesmos valores não-nulos nas colunas únicas.

A restrição de chave primária é a restrição de unicidade que especifica PRIMARY KEY. A restrição de chave primária é satisfeita se, e somente se, não houverem duas linhas da tabela com os mesmos valores não-nulos nas colunas únicas, e nenhum dos valores da coluna ou colunas especificadas for o valor nulo.

A restrição referencial especifica uma ou mais colunas como colunas que fazem referência, e as colunas referenciadas correspondentes em alguma (não necessariamente distinta) tabela base, referida como tabela referenciada. Estas colunas referenciadas são colunas únicas de alguma restrição de unicidade da tabela referenciada. A restrição referencial está sempre satisfeita se, para toda linha da tabela que faz referência, os valores das colunas que fazem referência são iguais àqueles das colunas referenciadas correspondentes de alguma linha da tabela referenciada. Entretanto, se estiverem presentes valores nulos a satisfação da integridade referencial depende do tratamento especificado para os nulos (conhecido como o tipo de correspondência).

Podem ser especificadas ações referenciais para determinar que alterações devem ser feitas na tabela que faz referência se, de outra forma, uma alteração na tabela referenciada causasse a violação da restrição referencial.

Uma restrição de verificação de tabela especifica uma condição de procura. A restrição é violada se o resultado da condição de procura for falso para qualquer linha da tabela (mas não se for desconhecido).

(ISO-ANSI Working Draft) Framework (SQL/Framework), August 2003, ISO/IEC JTC 1/SC 32, 25-jul-2003, ISO/IEC 9075-2:2003 (E) (N. do T.)

[3]

disfunção — dificuldade ou problema de funcionamento. PRIBERAM - Língua Portuguesa On-Line (N. do T.)

SourceForge.net Logo