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 ]
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]
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.
Dica: Não se recomenda utilizar WITHOUT OIDS para tabelas sem chave primária, porque sem OID e sem chave de dados única fica difícil identificar uma linha específica.
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) );
O comando CREATE TABLE está em conformidade com o SQL-92 e com um subconjunto do SQL:1999, com as exceções listadas abaixo.
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.
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.
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ç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.
O conceito de OIDs (identificadores de objeto) do PostgreSQL não é padrão.
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.
[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.) |