Sintaxe CREATE TABLE
CREATE TABLE
cria uma tabela com op nome dado no banco de dados atual.
As regras para nomes de tabelas permitidos são dados em "Nomes de Banco de dados, Tabela, Índice, Coluna e Alias". Por padrão a tabela é criada no banco de dados atual. Um erro ocorre se não houver o banco de dados atual ou se a tabela já existir.
Desde o MariaDB v3.22, o nome de tabela pode ser especificado como nome_bd.nome_tabela
para criar a tabela em um banco de dados específico. Ele funciona sem se preoocupar se existe um banco de dados atual.
Desde o MariaDB v3.23, você pode usar a palavra-chave TEMPORARY
qaundo você criar uma tabela. A tabela temporária é visível apenas a para a conexão atual, e será automaticamente deletada quando a conexão é fechada. Isto significa que duas conexões diferentes podem usar o mesmo nome de tabela temporária sem conflitos outras ou com uma tabela existente com o mesmo nome. (A tabela existente é escondida até que a tabela temporária seja deletada). A partir do MariaDB 4.0.2 você deve ter o privilégio CREATE TEMPORARY TABLES
para poder criar tabelas temporárias.
Desde o MariaDB v3.23 você pode utilizar as palavras-chaves IF NOT EXISTS
para que não ocorra um erro se a tabela já existir. Note que não há verificação de que a tabela existente tem uma estrutura idêntica a aquela indicada pela instrução CREATE TABLE
A partir da versão 4.1.0, o atributo SERIAL
pode ser usado com um alias para BIGINT NOT NULL AUTO_INCREMENT UNIQUE
. Este é um recuros para compatibilidade.
Como no MariaDB 3.23, você pode criar uma tabela de autra adicionando uma instrução SELECT
no fim da instrução CREATE TABLE
:
CREATE TABLE new_tbl SELECT * FROM orig_tbl;
Os índices não são transportados para a nova tabela, e algumas conversões de tipos de coluna podem ocorrer. Por exemplo, o atributoAUTO_INCREMENT
não está preservado e colunas VARCHAR
podem se tornar colunas CHAR
.
Quando criar uma tabela com CREATE ... SELECT
, de um apelido para qualquer chamada de função ou expressões em uma consulta. Se você não o fizer, a instrução CREATE
pode falhar ou resultar em nomes de colunas indesejáveis.
CREATE TABLE artists_and_works SELECT artist.name, COUNT(work.artist_id) AS number_of_works FROM artist LEFT JOIN work ON artist.id = work.artist_id GROUP BY artist.id;
No MySQL, você pode especificar explicitamente o tipo para uma coluna gerada:
CREATE TABLE foo (a tinyint not null) SELECT b+1 AS 'a' FROM bar;
No MariaDB você pode utilizar LIKE
para criar uma tabela baseada em uma definição de outra tabela. No MariaDB você também pode especificar o tipo para uma coluna gerada:
CREATE TABLE new_tbl LIKE orig_tbl;
Cada tabela nome_tabela
é representada por algum arquivo no diretório de banco de dados. No caso das tabelas tipo MyISAM
você irá obter:
CREATE TABLE ... LIKE
não copia nenhuma opção de tabela DATA DIRECTORY
ou INDEX DIRECTORY
que foi especificada para a tabela original.
Arquivo | Proposito |
nome_tabela.frm
| Arquivo de formato (definição) da tabela. |
nome_tabela.MYD
| Arquivo de dados |
nome_tabela.MYI
| Arquivo Índice |
Para mais informações de propriedades de varios tipo de coluna, veja "Tipos de Campos":
- Se nem
NULL
nemNOT NULL
for especificado, a coluna é tratada como seNULL
fosse especificado. - Uma coluna integer pode ter o atributo adicional
AUTO_INCREMENT
. Quando você insere um valor deNULL
(recomendado) ou0
em uma colunaAUTO_INCREMENT
indexada, a coluna é definida com o valor da próxima sequência. Normalmente ele évalor+1
, ondevalor
é o maior valor para a coluna column atualmente na tabela. A sequência deAUTO_INCREMENT
começa com1
. Leia "mysql_insert_id()
".A partir do MariaDB, especificando o parâmetro
NO_AUTO_VALUE_ON_ZERO
para a opção do servidor--sql-mode
ou a variável do servidorsql_mode
permite que você aramzene0
nas colunasAUTO_INCREMENT
como0
, em vez de gerar uma nova sequência de valores. Leia "Opções de Linha de Comando domysqld
".Se você deletar a linha contendo o valor máximo para uma coluna
AUTO_INCREMENT
, o valor será reutilizado por uma tabelaISAM
, ouBDB
, mas não por tabelasMyISAM
ouInnoDB
. Se você deletar todas as linhas na sua tabela comDELETE FROM nome_tabela
(sem umWHERE
) no modoAUTOCOMMIT
, a sequencia será reiniciada em todos os tipos de tabela, excetoInnoDB
. Leia "Como Funciona uma ColunaAUTO_INCREMENT
no InnoDB".Nota: Só pode haver uma coluna
AUTO_INCREMENT
por tabela, e ela deve ser indexada e não pode ter uma valorDEFAULT
. No MariaDB Versão 3.23, uma colunaAUTO_INCREMENT
funcionará corretamente apenas se conter apenas valores positivos. Inserir um número negativo é considerado como a inserção de um número positivo muito grande. Isto ocorre para evitar problemaa de precisão quando os números vão de positivo para negativo e também para assegurar que não se obtenha, acidentalmente, uma colunaAUTO_INCREMENT
que contenha 0.Em tabelas
MyISAM
eBDB
você pode especificar colunasAUTO_INCREMENT
secundárias em uma chave ulti-coluna. Leia "UsandoAUTO_INCREMENT
".Para tornar MariaDB compatível com alguns aplicativos ODBC, você pode encontrar o valor
AUTO_INCREMENT
da última linha inserida com a seguinte consulta:SELECT * FROM nome_tabela WHERE auto_col IS NULL
- Valores
NULL
são tratados em colunasTIMESTAMP
de modo diferente de outros tipos de colunas. Você não pode armazenar umNULL
literal em uma colunaTIMESTAMP
; definindo a coluna comNULL
lhe atribui a a data e a hora atual. Como colunasTIMESTAMP
se comportam desta forma, os atributosNULL
eNOT NULL
não se aplicam de modo normal e são ignorados se você os especificar.
Por outro lado, tornar o uso de colunas
TIMESTAMP
mais fácil para os clientes MySQL, o servidor relata que tal coluna pode ter o valorNULL
atribuído (a que é verdade), mesmo queTIMESTAMP
nunca contenham, realmente, um valorNULL
. Você pode ver isto quando você utilizaDESCRIBE nome_tabela
para obter informações sobre sua tabela.Note que definir uma coluna
TIMESTAMP
com0
não é o mesmo que definí-la comNULL
, porque0
é um valorTIMESTAMP
válido. - Um valor padrão (
DEFAULT
) tem que ser constante, ele não pode ser uma função ou uma expressão.Se nenhum valor
DEFAULT
é especificado para uma coluna, o MariaDB atribuirá um automaticamente, como a seguir.Se a coluna aceitar
NULL
como um valor, o valor padrão éNULL
.Se a coluna é declarada como
NOT NULL
, o valor padrão depende do tipo de coluna:- Para tipos numéricos não declarados com o atributo
AUTO_INCREMENT
, o padrão é0
. Para uma colunaAUTO_INCREMENT
, o valor padrão é o próximo valor na sequência. - Para tipos date e time diferentes de
TIMESTAMP
, o padrão é o valor zero apropriado para o tipo. Para a primeira colunaTIMESTAMP
na tabela, o padrão é a data e hora atuais. Leia "Tipos de Data e Hora". - Para tipos string diferentes de
ENUM
, o valor padrão é uma string vazia. ParaENUM
, o padrão é o primeiro valor enumerado.
Valores padrões devem ser constantes. Isto significa, por exemplo, que você não pode definir o padrão de uma coluna date como o valor de funções como
NOW()
orCURRENT_DATE
. - Para tipos numéricos não declarados com o atributo
- Um comentário para uma coluna pode ser especificado com a opção
COMMENT
. O comentário é mostrado pela instruçãoSHOW CREATE TABLE
e porSHOW FULL COLUMNS
. Esta opção está disponível a partir do MariaDB 4.1. (Ela é perimitida mas ignorada em versões anteriores.) KEY
é normalmente um sinônimo paraINDEX
. A partir da versão 4.1, o atributo de chavePRIMARY KEY
também pode ser especificado apenas comoKEY
. Isto foi implementado para compatibilidade com outros bancos de dados.- No MySQL,uam chave
UNIQUE
só pode ter valores distintos. Um erro ocorre se você tantar adicionar uma nova linha com uma chave que coincida com uma já existente. PRIMARY KEY
é uma chave única (KEY
) onde todas as colunas chaves devem ser definidas comoNOT NULL
. Se elas não forem explicitamente declaradas comoNOT NULL
, isto será feito implicitamente e sem aviso. No MariaDB a chave é chamadaPRIMARY
. Uma tabela pode ter apenas umaPRIMARY KEY
. Se você não tiver umaPRIMARY KEY
e alguma aplicação perguntar pelaPRIMARY KEY
em sua tabela, o MariaDB retornará a primeira chaveUNIQUE
, que não possui nenhuma colunaNULL
, como aPRIMARY KEY
.- Uma
PRIMARY KEY
pode ser um índice multi-coluna. Porém, você não pode criar um índice multi-coluna usando o atributo de chavePRIMARY KEY
em uma especificação de coluna. Fazendo assim apenas colunas simples poderão ser marcadas como primárias. Você deve utilizar uma cláusulaPRIMARY KEY(index_nome_coluna, ...)
separada. - Um índice
UNIQUE
é aquele no qual todos os valores no índice devem ser distintos. A exceção a isto é que se for permtido conter valoresNULL
em uma coluna no índice, ele pode conter múltiplos valoresNULL
. Este exceção não se aplica a tabelasBDB
, que permitem apenas um únicoNULL
. - Se a chave
PRIMARY
ouUNIQUE
consistir de apenas uma coluna e ela é do tipo inteiro, você também poderá se referir a ela como_rowid
(novo na versão 3.23.11). - Se você não atribuir um nome ao índice que não é um
PRIMARY KEY
, ele terá o mesmo nome da prmeiraindex_nome_coluna
, com um sufixo opicional (_2
,_3
,...
) para torná-lo único. Você pode nome de índices para uma tabela usandoSHOW INDEX FROM nome_tabela
. Leia "Recuperando Informações sobre Bancos de Dados, Tabelas, Colunas e Índices". - Apenas os tipos de tabelas
MyISAM
,InnoDB
, eBDB
suportam índices em coluna que possam ter valoresNULL
. Nos outros casos você deve declarar tais colunasNOT NULL
ou um erro será retornado. - Com a sintaxe
nome_coluna(length)
em uma especificação de índice, você pode criar um índice que utiliza apenas os primeiroslength()
bytes de uma colunaCHAR
ouVARCHAR
. Isto pode tornar o arquivo de índices muito menor. Leia "Índices de Colunas". - Apenas os tipos de tabela
MyISAM
e (a partir do MariaDB 4.0.14)InnoDB
suportam índice em colunasBLOB
eTEXT
. Ao colocar um índice em uma colunaBLOB
ouTEXT
você sempre DEVE especificar o tamanho do índice, até 255 bytes. Por exemplo:CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
- Uma especificação
index_col_name
pode finalizar comASC
ouDESC
. Esta palavras chaves são permitidas para estensão futura para especificar o armazenamento do valor do índice em crescente ou decrescente. Atualmente elas são analisadas mas ignoradas; valores de índice são sempre armazenados em ordem crescente. - Quando você utiliza
ORDER BY
ouGROUP BY
com uma colunaTEXT
ouBLOB
, o servidor ardena valores usando apenas o número inicial de bytes, indicado pela variável do servidormax_sort_length
. Leia "Os TiposBLOB
eTEXT
". - No MariaDB Versão 3.23.23 ou posterior, você também pode criar índices
FULLTEXT
especiais. Eles são usados para busca full-text. Apenas o tipo de tabelaMyISAM
suporta índicesFULLTEXT
. Eles só podem ser criados em colunasCHAR
,VARCHAR
, eTEXT
. A indexação sempre ocorre sobre toda a coluna; índices parciais não são suportados. Veja "Pesquisa Full-text no MySQL" para detalhes de operação. - No MariaDB Versão 3.23.44 ou posterior, tabelas
InnoDB
suportam verificação de chaves estrangeiras. Leia "TabelasInnoDB
". Note que a sintaxeFOREIGN KEY
noInnoDB
é mais restrita que a sintaxe apresentada acima. As colunas da tabela indicada devem ser nomeadas explicitmente. O InnoDB suporta ambas as açõesON DELETE
eON UPDATE
em chaves esrtrangiras nos MariaDB 3.23.50 e 4.0.8, respectivamente. Veja a seçãoInnoDB
do manual para a sintaxe precisa. See "RestriçõesFOREIGN KEY
". Para outros tipos de tabelas, MariaDB Server analisa as sinatxesFOREIGN KEY
,CHECK
eREFERENCES
no comandoCREATE TABLE
, mas sem tal ação ser tomada. Leia "Chaves Estrangeiras". - Para tabelas
ISAM
eMyISAM
, cada colunaNULL
tem um bit extra, arredondado para o byte mais próximo. O tamanho máximo de um registro em bytes pode ser calculado como a seguir:
tamanho da linha = 1 + (soma do tamanho da coluna) + (números de coluna NULL + delete_flag 7)/8 + (número de colunas de tamanho variável)
delete_flag
é 1 para tabelas com formato de registro estático. Tabelas estáticas usam um bit no registro para um parâmetro que indica se o linha foi deletada.delete_flag
é 0 para tabelas dinâmicas porque este parâmetro é armazenado no cabeçalho da linha dinâmica.Estes cálculos não se aplicam à tabelas
InnoDB
, para a qual o tamanho do armazenamento não é diferente para colunasNULL
comparados a colunasNOT NULL
. - A opçao
opção_tabela
eSELECT
só são implmentadas no MariaDB Versão 3.23 e acima.
A opção
TYPE
para especificar o tipo de tabela possui os seguintes valores:Tipo de tabela Descrição BDB
ouBerkeleyDB
Tabelas de transação segura com bloqueio de página. Leia "Tabelas BDB
ouBerkeleyDB
".HEAP
Os dados desta tabela são armazenados apenas na memória. Leia "Tabelas HEAP
".ISAM
O mecanismo de armazenamento original. Leia "Tabelas ISAM
".InnoDB
Tabelas com transações eguras com bloqueio de linha. Leia "Tabelas InnoDB
".MERGE
Uma coleção de tabelas MyISAM usadas como uma tabela. Leia "Tabelas MERGE
".MRG_MyISAM
Um apelido para tabelas MERGE MyISAM
O novo mecanismo de armazenamento portável binário que substitui o ISAM. Leia "Tabelas MyISAM
".See Tipos de Tabela do MariaDB.
Se um tipo de tabela é especificado, e este tipo não está disponível, MariaDB irá usar
MyISAM
. Por exemplo, se uma definição de tabela inclui a opçãoTYPE=BDB
mas o MariaDB não suporta tabelasBDB
, a tabela será criada como uma tabelaMyISAM
. Isto torna possível de se ter uma configuração de replicação onde você tem tabelas transacionaisno master mas as tabelas criadas no slave são não transacionais (para obter mais velocidade). No MariaDB você obtém um aviso se o tipo de tabela especificado não é aceito.Os outros tipos de tabelas são utilizados para otimizar o comportamento da tabela. Na maioria dos casos, você não precisa especificar nenhuma delas. As opções funcionam com todos os tipos, a menos que haja indicação:
Opção Descrição AUTO_INCREMENT
O próximo valor AUTO_INCREMENT
que você quer definir em sua tabela (apenasMyISAM
; para definir o primeiro valor auto incrementeem uma tabela InnoDB insira uma linha com um valor de menos um e delete esta linha).AVG_ROW_LENGTH
Uma aproximação do tamanho médio de linha em sua tabela. Você só precisa definí-la para tabelas grnades com tamanho de registros variáveis. CHECKSUM
Defina com 1 se você quiser manter um checksum para todas as linha (deixa a tabela um pouco mais lenta para atualizações, mas fica mais fácil encontrar tabelas corrompidas) (apenas MyISAM
).COMMENT
Um comentário de 60 caracteres para a sua tabela. MAX_ROWS
Número máximo de linhas que você deseja armazenar na tabela. MIN_ROWS
Número mínimo de linha que você planeja armazenar na tabela. PACK_KEYS
Defina com 1 se você quiser um índice menor, Normalmente torna a atualização mais lenta e a leitura mais rápida (apenas MyISAM
eISAM
). Definr com 0 irá desabilitar empacotamento das chaves. Definir comDEFAULT
(MySQL 4.0) dirá ao mecanismo de armazenamento para empacotar apenas colunasCHAR
/VARCHAR
longas.PASSWORD
Criptografa o arquivo .frm
com uma senha. Esta opção não fa nada na versão padrão do MariaDB.DELAY_KEY_WRITE
Defina com 1 se quiser atrasar a atualização das chaves da tabela até que a tabela seja fechada (apenas MyISAM
).ROW_FORMAT
Define como as linhas devem ser armazenadas. Atualmente esta opção só funciona com tabelas MyISAM
, as quais suportam os formatos de linhaDYNAMIC
eFIXED
. See "Formatos de TabelasMyISAM
".Quando você utiliza uma tabela
MyISAM
, MariaDB usa o produto deMAX_ROWS * AVG_ROW_LENGTH
para decidir o tamanho da tabela resultante. Se você não especificar qualquer uma das opções acima, o tamanho máximo de uma tabela será 4G (ou 2G se o seu sistema operacional só suporta tabelas de 2G). A razão para isto é apenas manter o tamanho dos ponteiros baixo para tornar o índice menor e mais rápido se você realmente não precisa de tabelas grandes.Se você não utilizar
PACK_KEYS
, o padrão é só empacotar strings, não números. Se você utilizarPACK_KEYS=1
, números também serão empacotados.Ao empacotar chaves numéricas binárias, o MariaDB usará a compactação prefixada. Isto significa que você só terá grandes benefícios disto se você tiver muitos números iguais. Compactação prefixada significa que toda a chave precisa de um byte extra para indicar quantos bytes das caves anteriores são o mesmo da próxima chave (note que o ponteiro para a linha é armazenado na ordem do byte mais alto em primeiro diretamente depois da chave, para aumentar compactação). Isto significa que se você tiver muitas chaves iguais em duas linhas consecutivas, todas os chaves
iguais
seguintes irão normalmente ter apenas 2 bytes (incluindo o ponteiro para a linha). Compare isto isto ao caso comum onde as chaves seguintes irão levar tamanho_armazenamento_chave + tamanho_ponteiro (nomralmente 4). Por outro lado, se todas as chaves são totalmente diferente, você usará 1 byte por chave, se a chave não puder ter valoresNULL
. (Neste caso o tamanho da chave empacotada será armazenado no mesmo byte que é usado para marcar se a chave éNULL
.) - No MariaDB 3.23, Se você especificar um
SELECT
depois de uma instruçãoCREATE
, MariaDB criará novos campos para todos os elemento emSELECT
. Por exemplo:
mysql>
CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT,
->PRIMARY KEY (a), KEY(b))
->TYPE=MyISAM SELECT b,c FROM test2;
Isto irá criar uma tabela
MyISAM
com três colunas, a, b e c. Note que as colunas da instruçãoSELECT
são inseridas do lado correto da tabela, nào sobreposta nela. Considere o seguinte exemplo:mysql>
SELECT * FROM foo;
+---+ | n | +---+ | 1 | +---+ mysql>CREATE TABLE bar (m INT) SELECT n FROM foo;
Query OK, 1 row affected (0.02 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql>SELECT * FROM bar;
+------+---+ | m | n | +------+---+ | NULL | 1 | +------+---+ 1 row in set (0.00 sec)Para cada linha na tabela
foo
, uma linha é inserida embar
com os valores defoo
e os valores padrões para a nova coluna.CREATE TABLE ... SELECT
não irá criar automaticamente nenhum índice para você. Isto é feito intencionalmente para deixar o comando o mais flexível possível. Se você quiser ter índices em uma tabela criada, você deve especificá-lo antes da instruçãoSELECT
:mysql>
CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;
Se ocorrer qualquer erro durante enquanto os dados são copiados para a tabela, ele será automaticamente deletado.
Você pode preceder o
SELECT
porIGNORE
ouREPLACE
para indicar como tratar registros que duplicam valores de chave única. ComIGNORE
, novos registros que duplicam um registro existente em um valor de chave única são descartados. ComREPLACE
, novos registros substituem registros que tem o mesmo valor de chave única. Se nemIGNORE
nemREPLACE
são especificados, valir de chave unica duplicados resultam em erro.Para assegurar que o log binário/atualização pode ser usado para recriar a tabela original, MariaDB não permitirá inserções concorrentes durante um
CREATE TABLE ... SELECT
. - A opção
RAID_TYPE
irá ajudá-lo a exceder o limite de 2G/4G limit para arquivo de dados MyISAM (não o arquivo de índice) em sistemas operacionais que não suportam arquivos grandes. Note que esta opção não é recomendada para sistema de arquivos que suportam arquivos grandes!Você pode obter mais velocidade da gargalo de E/S colocando diretorios
RAID
em diferentes discos físicos.RAID_TYPE
funcionará em qualquer sistema operacional, desde que você tenha configurado o MariaDB com--with-raid
. Por agora o únicoRAID_TYPE
permitido éSTRIPED
(1
eRAID0
são utilizados para isto).Se você especificar
RAID_TYPE=STRIPED
para tabealsMyISAM
,MyISAM
criará subdiretóriosRAID_CHUNKS
chamados 00, 01, 02 no diretório de banco de dados. Em cada um destes diretóriosMyISAM
criará umanome_tabela.MYD
. Ao escrever dados no arquivo de dados, o manipuladorRAID
irá mapear o primeiroRAID_CHUNKSIZE
*1024 bytes para o primeiro arquivo e os próximosRAID_CHUNKSIZE
*1024 bytes para o próximo arquivo. UNION
é utilizado quando você quer utilizar uma coleção de tabelas identicas como uma. Isto só funciona com tabelasMERGE
. Leia "TabelasMERGE
".
No momento você precisa ter privilégios
SELECT
,UPDATE
eDELETE
nas tabelas mapeadas para uma tabelaMERGE
. Todas as tabelas mapeadas devem estar no mesmo banco de dados na tabelaMERGE
.- Se você quiser inserir dados em uma tabela
MERGE
, você tem que especificar comINSERT_METHOD
na tabela onde o registro deve ser inserido.INSERT_METHOD
é uma opção útil somente para tabelasMERGE
. Leia "TabelasMERGE
". Esta opção foi introduzida no MariaDB 4.0.0. - Na tabela criada a chave
PRIMARY
será colocado primeiro, seguida de todas a chaves únicas (UNIQUE
) e então das chaves normais. Isto ajuda o otimizador MariaDB para priorizar qual chave utilizar e também a detectaa mais rapidamente chaves únicas (UNIQUE
) duplicadas. - Utilizando
DATA DIRECTORY='directorio'
ouINDEX DIRECTORY='directorio'
você pode especificar onde o mecanismo de armazenamento deve colocar os seus arquivos de tabelas e índices. Note quediretório
deve ser um caminho completo para o diretório (não um caminho relativo).
Isto só funciona para tabelas
MyISAM
noMariaDB
4.0, quando não estiver usando a opção--skip-symlink
. Leia "Utilizando Links Simbólicos para Tabelas".