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
NULLnemNOT NULLfor especificado, a coluna é tratada como seNULLfosse especificado. - Uma coluna integer pode ter o atributo adicional
AUTO_INCREMENT. Quando você insere um valor deNULL(recomendado) ou0em uma colunaAUTO_INCREMENTindexada, 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_INCREMENTcomeça com1. Leia "mysql_insert_id()".A partir do MariaDB, especificando o parâmetro
NO_AUTO_VALUE_ON_ZEROpara a opção do servidor--sql-modeou a variável do servidorsql_modepermite que você aramzene0nas colunasAUTO_INCREMENTcomo0, 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 tabelasMyISAMouInnoDB. 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_INCREMENTno InnoDB".Nota: Só pode haver uma coluna
AUTO_INCREMENTpor tabela, e ela deve ser indexada e não pode ter uma valorDEFAULT. No MariaDB Versão 3.23, uma colunaAUTO_INCREMENTfuncionará 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_INCREMENTque contenha 0.Em tabelas
MyISAMeBDBvocê pode especificar colunasAUTO_INCREMENTsecundárias em uma chave ulti-coluna. Leia "UsandoAUTO_INCREMENT".Para tornar MariaDB compatível com alguns aplicativos ODBC, você pode encontrar o valor
AUTO_INCREMENTda última linha inserida com a seguinte consulta:SELECT * FROM nome_tabela WHERE auto_col IS NULL
- Valores
NULLsão tratados em colunasTIMESTAMPde modo diferente de outros tipos de colunas. Você não pode armazenar umNULLliteral em uma colunaTIMESTAMP; definindo a coluna comNULLlhe atribui a a data e a hora atual. Como colunasTIMESTAMPse comportam desta forma, os atributosNULLeNOT NULLnão se aplicam de modo normal e são ignorados se você os especificar.
Por outro lado, tornar o uso de colunas
TIMESTAMPmais fácil para os clientes MySQL, o servidor relata que tal coluna pode ter o valorNULLatribuído (a que é verdade), mesmo queTIMESTAMPnunca contenham, realmente, um valorNULL. Você pode ver isto quando você utilizaDESCRIBE nome_tabelapara obter informações sobre sua tabela.Note que definir uma coluna
TIMESTAMPcom0não é o mesmo que definí-la comNULL, porque0é um valorTIMESTAMPvá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
NULLcomo 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 colunaTIMESTAMPna 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 TABLEe 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 KEYtambém pode ser especificado apenas comoKEY. Isto foi implementado para compatibilidade com outros bancos de dados.- No MySQL,uam chave
UNIQUEsó 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 KEYe alguma aplicação perguntar pelaPRIMARY KEYem sua tabela, o MariaDB retornará a primeira chaveUNIQUE, que não possui nenhuma colunaNULL, como aPRIMARY KEY.- Uma
PRIMARY KEYpode ser um índice multi-coluna. Porém, você não pode criar um índice multi-coluna usando o atributo de chavePRIMARY KEYem 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 valoresNULLem 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
PRIMARYouUNIQUEconsistir 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, eBDBsuportam índices em coluna que possam ter valoresNULL. Nos outros casos você deve declarar tais colunasNOT NULLou 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 colunaCHARouVARCHAR. Isto pode tornar o arquivo de índices muito menor. Leia "Índices de Colunas". - Apenas os tipos de tabela
MyISAMe (a partir do MariaDB 4.0.14)InnoDBsuportam índice em colunasBLOBeTEXT. Ao colocar um índice em uma colunaBLOBouTEXTvocê 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_namepode finalizar comASCouDESC. 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 BYouGROUP BYcom uma colunaTEXTouBLOB, o servidor ardena valores usando apenas o número inicial de bytes, indicado pela variável do servidormax_sort_length. Leia "Os TiposBLOBeTEXT". - No MariaDB Versão 3.23.23 ou posterior, você também pode criar índices
FULLTEXTespeciais. Eles são usados para busca full-text. Apenas o tipo de tabelaMyISAMsuporta í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
InnoDBsuportam verificação de chaves estrangeiras. Leia "TabelasInnoDB". Note que a sintaxeFOREIGN KEYnoInnoDBé mais restrita que a sintaxe apresentada acima. As colunas da tabela indicada devem ser nomeadas explicitmente. O InnoDB suporta ambas as açõesON DELETEeON UPDATEem chaves esrtrangiras nos MariaDB 3.23.50 e 4.0.8, respectivamente. Veja a seçãoInnoDBdo manual para a sintaxe precisa. See "RestriçõesFOREIGN KEY". Para outros tipos de tabelas, MariaDB Server analisa as sinatxesFOREIGN KEY,CHECKeREFERENCESno comandoCREATE TABLE, mas sem tal ação ser tomada. Leia "Chaves Estrangeiras". - Para tabelas
ISAMeMyISAM, cada colunaNULLtem 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 colunasNULLcomparados a colunasNOT NULL. - A opçao
opção_tabelaeSELECTsó são implmentadas no MariaDB Versão 3.23 e acima.
A opção
TYPEpara especificar o tipo de tabela possui os seguintes valores:Tipo de tabela Descrição BDBouBerkeleyDBTabelas de transação segura com bloqueio de página. Leia "Tabelas BDBouBerkeleyDB".HEAPOs dados desta tabela são armazenados apenas na memória. Leia "Tabelas HEAP".ISAMO mecanismo de armazenamento original. Leia "Tabelas ISAM".InnoDBTabelas com transações eguras com bloqueio de linha. Leia "Tabelas InnoDB".MERGEUma coleção de tabelas MyISAM usadas como uma tabela. Leia "Tabelas MERGE".MRG_MyISAMUm apelido para tabelas MERGE MyISAMO 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=BDBmas 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_INCREMENTO próximo valor AUTO_INCREMENTque 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_LENGTHUma 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. CHECKSUMDefina 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).COMMENTUm comentário de 60 caracteres para a sua tabela. MAX_ROWSNúmero máximo de linhas que você deseja armazenar na tabela. MIN_ROWSNúmero mínimo de linha que você planeja armazenar na tabela. PACK_KEYSDefina com 1 se você quiser um índice menor, Normalmente torna a atualização mais lenta e a leitura mais rápida (apenas MyISAMeISAM). Definr com 0 irá desabilitar empacotamento das chaves. Definir comDEFAULT(MySQL 4.0) dirá ao mecanismo de armazenamento para empacotar apenas colunasCHAR/VARCHARlongas.PASSWORDCriptografa o arquivo .frmcom uma senha. Esta opção não fa nada na versão padrão do MariaDB.DELAY_KEY_WRITEDefina com 1 se quiser atrasar a atualização das chaves da tabela até que a tabela seja fechada (apenas MyISAM).ROW_FORMATDefine como as linhas devem ser armazenadas. Atualmente esta opção só funciona com tabelas MyISAM, as quais suportam os formatos de linhaDYNAMICeFIXED. See "Formatos de TabelasMyISAM".Quando você utiliza uma tabela
MyISAM, MariaDB usa o produto deMAX_ROWS * AVG_ROW_LENGTHpara 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
SELECTdepois 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
MyISAMcom três colunas, a, b e c. Note que as colunas da instruçãoSELECTsã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 embarcom os valores defooe os valores padrões para a nova coluna.CREATE TABLE ... SELECTnã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
SELECTporIGNOREouREPLACEpara 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 nemIGNOREnemREPLACEsã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_TYPEirá 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
RAIDem diferentes discos físicos.RAID_TYPEfuncionará em qualquer sistema operacional, desde que você tenha configurado o MariaDB com--with-raid. Por agora o únicoRAID_TYPEpermitido éSTRIPED(1eRAID0são utilizados para isto).Se você especificar
RAID_TYPE=STRIPEDpara tabealsMyISAM,MyISAMcriará subdiretóriosRAID_CHUNKSchamados 00, 01, 02 no diretório de banco de dados. Em cada um destes diretóriosMyISAMcriará umanome_tabela.MYD. Ao escrever dados no arquivo de dados, o manipuladorRAIDirá 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,UPDATEeDELETEnas 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_METHODna 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
PRIMARYserá 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
MyISAMnoMariaDB4.0, quando não estiver usando a opção--skip-symlink. Leia "Utilizando Links Simbólicos para Tabelas".