Sintaxe INSERT
INSERT insere novos registros em uma tabela existente. A forma INSERT ... VALUES da instrução insere registros baseado em valores especificados explicitamente. A forma INSERT ... SELECT insere linhas selecionadas de outra(s) tabela(s). A forma INSERT ... VALUES com listas de múltiplos valores é suportado a partir da versão 3.22.5. A sintaxe nome_coluna=expressão é suportada a partir da verão 3.22.10 do MariaDB.
nome_tabela é a tabela na qual as linhas serão inseridas. A lista de nome das colunas ou a cláusula SET indica para quais colunas a instrução especifica valor:
- Se você não especificar a lista de colunas para
INSERT ... VALUESouINSERT ... SELECT, os valores para todas as colunas na tabela devem ser fornecidos na listaVALUES()ou peloSELECT. Se você não souber a ordem das colunas nas tabelas, useDESCRIBE nome_tabelapara descobrir. - Qualquer coluna que não tiver o valor fornecido explicitamente assumirá o seu valor padrão. Por exemplo, se você especificar uma lista de colunas que não definem todas as coolunas na tabela, às colunas não definidas serão atribuídos o seu valor padrão. Atribuição de valor padrão é definido em "Sintaxe
CREATE TABLE".Você também pode utilizar a palavra-chave
DEFAULTpara atribuir o valor padrão a uma coluna (Novo na versão 4.0.3. do MariaDB). Fica mais fácil de se escrever instruçõesINSERTque atribuem valor a apenas algumas colunas porque ele permite que você evite escrever uma listaVALUES()incompleta (uma lista que não inclu um valor para cada coluna da tabela). De outa forma, você teria que escrever a lista de nomes de colunas correspondentes a cada valor na listaVALUES().MySQL sempre tem uma valor padrão para todos os campos. Isto é algo imposto pelo MariaDB para estar apto a funcionar com tabelas transacionais e não transcaionais.
Nossa visão é que a verificação do conteúdo dos campos deve ser feita pela application and not in the database server.
- Uma
expressãopode se referir a qualquer coluna que tenha sida definaida anteriormente na lista de valores. Por exemplo, você pode dizer:mysql>
INSERT INTO nome_tabela (col1,col2) VALUES(15,col1*2);Mas não:
mysql>
INSERT INTO nome_tabela (col1,col2) VALUES(col2*2,15); - Se você especificar a palavra chave
DELAYED, o servidor coloca a linha ou linhas a serem inseridas em um buffer, e o cliente que envia a instruçãoINSERT DELAYEDentão pode contiuar. Se a tabela está ocupada, o servidor guarda a linha. Quando a tabela fica livre, ele começa a inserir linhas, verificando periódicamente para ver se há novos pedidos de leitura para a tabela. Se houver, a fila de linhas atrasadas é suspensa até que a tabela fique livre de novo. - Se você especificar a palavra-chave
LOW_PRIORITY, a execução doINSERTé atrasada até que nenhum outro cliente esteja lendo a tabela. Isto inclui outros clientes que começam a ler enquanto clientes existentes já estão lendo e enquanto a instruçãoINSERT LOW_PRIORITYestá esperando. É possível, consequentemente, para um cliente que envia uma instruçãoINSERT LOW_PRIORITYesperar por um tempo muito longo (ou mesmo para sempre) em um ambiente de muita leitura. (É diferente deINSERT DELAYED, que deixa o cliente continuar de uma vez. Leia "SintaxeINSERT DELAYED". Note queLOW_PRIORITYnão deve normalmente ser usado com tabelasMyISAMja que elas disabilitam inserções concorrentes. Leia "TabelasMyISAM". - Se você especificar a palavra-chave
IGNOREem umINSERTcom muitas linhas, quqlquer linha que duplicar uma chavePRIMARYouUNIQUEexistente em uma tabela são ignorados e não são inseridos. Se você não especificarIGNORE, a inserção é abortada se houver quqlquer linhq que duplique um valor de uma chave existente. Você pode determinar com funçãomysql_info()da API C quantas linhas foram inseridas nas tabelas. - Se você especificar se uma cláusula
ON DUPLICATE KEY UPDATE(noca no MariaDB 4.1.0), e uma linha que causasse a duplicação de um valor fosse inserida em uma chavePRIMARYouUNIQUE, umUPDATEda linha antiga seria realizado. Por exemplo, o comando:mysql>
INSERT INTO table (a,b,c) VALUES (1,2,3)->ON DUPLICATE KEY UPDATE c=c+1;no caso da coluna
aser declarada comoUNIQUEe ja existir o valor1, o exemplo acima seria idêntico amysql>
UPDATE table SET c=c+1 WHERE a=1;Nota: se a coluna
btambém for única, o comandoUPDATEseria escrito comomysql>
UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;e se
a=1 OR b=2casasse com diversas linhas, somente uma linha será atualizada! em geral, deve-se tentar evitar utilizar a cláusulaON DUPLICATE KEYem tabelas com múltiplas chavesUNIQUE.Desde o MariaDB pode-se utilizar a função
VALUES(nome_coluna)para se referir ao valor da coluna na parteINSERTdo comandoINSERT ... UPDATE- que é o valor que seria inserido se não houvesse conflitos de chaves duplicadas. Esta função é especialmente útil em inserções de múltiplas linhas. Naturalmente a funçãoVALUES()só tem sentido em um comandoINSERT ... UPDATEe retornaNULLno caso de outros comandos.Exemplo:
mysql>
INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)->ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);O camondo acima e idêntico a
mysql>
INSERT INTO table (a,b,c) VALUES (1,2,3)->ON DUPLICATE KEY UPDATE c=3;mysql>INSERT INTO table (a,b,c) VALUES (4,5,6)->ON DUPLICATE KEY UPDATE c=9;A utilizar
ON DUPLICATE KEY UPDATE, a opçãoDELAYEDé ignorada. - Se MariaDB foi configurado usando a opção
DONT_USE_DEFAULT_FIELDS, instruçõesINSERTgeram um erro a menos que você especifique valores explicitamete para todas as colunas que exigem um valor não-NULL. Leia "Opções típicas doconfigure". - Você pode encontrar o valor usado por uma coluna
AUTO_INCREMENTcom a funçãomysql_insert_id. Leia "mysql_insert_id()".
Se você utilizar instruções INSERT ... SELECT ou INSERT ... VALUES com lista de valores múltiplos, você pode utilizar a função mysql_info() da API C para obter informação sobre a consulta. O formato da string de informação é mostrado aqui:
Records: 100 Duplicates: 0 Warnings: 0
Duplicates indica o número de linhas que não puderam ser inseridas porque duplicariam alguns valores de índices únicos existentes. Warnings indica o número de tentativas de inserção de um valor em uma coluna que de alguma forma estava problematico. Avisos (Warnings) podem ocorrer sob qualquer uma das seguintes condições:
- Inserir
NULLem uma coluna declarada comNOT NULL. A coluna é definida com o seu valor padrão. - Definir uma coluna numérica com um valor que esteja fora da faixa permitida. O valor é revertido para final apropriado da faixa.
- Definir uma coluna numérica com um valor como
'10.34 a'. O lixo no final é eliminado e a parte numérica restante é inserida. Se o valor não fizer sentido como um número, é atribuido0a coluna. - Inserir uma string em uma coluna
CHAR,VARCHAR,TEXT, ouBLOBe que exceda o tamanho máximo da coluna. O valor é truncado para o tamanho máximo da coluna. - Inserir um valor em uma coluna date ou time e que seja inválido para o tipo da coluna. A coluna é preenchida com o valor de zero apropriado para o tipo.