Professional Documents
Culture Documents
Até Abril de 2004, mais de 4 milhões de instalações. Hoje, provavelmente, mais de 6 milhões.
Muitas declarações finalizam com “;”. É particularmente útil nas declarações com muitas linhas. Não faz
parte da declaração.
É possível que mais do que um dos valores para Key possam ser aplicados a uma determinada coluna
de uma tabela. Por exemplo, uma coluna que é uma PRIMARY KEY também pode ser parte de outros
índices. Quando é possível mais do que um valor para descrever o índice Key, DESCRIBE mostra o que
tem a prioridade mais elevada, na ordem PRI, UNI, MUL.
Porque uma coluna pode fazer parte de vários índices, os valores de Key nem sempre fornecem uma
descrição exaustiva dos índices de uma tabela. No entanto, para fins de exame, você deve assumir
que a descrição dada da tabela fornece todas as informações necessárias para responder
correctamente.
Default mostra o valor padrão da coluna. Este é o valor que o MySQL atribui à coluna quando uma
instrução para criar um novo registo não fornece um valor explícito para a coluna. (Por exemplo, isso
pode acontecer com os comandos INSERT, REPLACE, e LOAD DATA INFILE).
O valor Extra exibe outros detalhes sobre a coluna. O valor que nos interessa para o exame é o
AUTO_INCREMENT.
Sample Tables
C:\> mysql --user=root --password=sa
O campo Continent, na realidade, seria o seguinte: enum ('Asia', 'Europe', 'North America’, ’Africa’,
‘Oceania’, ‘Antarctica", "South America’).
mysql> DESCRIBE City;
+-------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| Name | char(35) | NO | | | |
| CountryCode | char(3) | NO | | | |
| District | char(20) | NO | | | |
| Population | int(11) | NO | | 0 | |
+-------------+----------+------+-----+---------+----------------+
O campo Name contém os nomes completos dos países. Cada país possui um campo CountryCode
composto por 3 letras que representa uma abreviatura.
Client/Server Concepts
1.1 General MySQL Architecture
MySQL opera em um ambiente de rede usando uma arquitectura cliente / servidor. Em outras palavras, um
programa actua como um servidor central, e vários programas cliente se conectam para fazer solicitações.
A instalação do MySQL tem os seguintes componentes principais:
MySQL Server, ou mysqld, é o programa do servidor da base de dados. O servidor gere o acesso às bases
de dados reais no disco e na memória. O MySQL Server é multi-threaded e suporta muitas conexões
simultâneas de clientes. Os clientes podem se conectar através da de vários protocolos. Para gerir o
conteúdo da base de dados, o MySQL Server possui uma arquitectura modular que suporta múltiplos
mecanismos de armazenamento que manipulam diferentes tipos de tabelas (por exemplo, trabalha tanto
com tabelas transaccionais como não transaccionais). O mysqld vem em várias configurações.
Distribuições MySQL Max contem um servidor chamado mysqld-max, que inclui funcionalidades que não
são incorporadas à versão non-Max, como suporte para os motores de armazenamento adicional. No
Windows, o mysqld-nt e servidores mysql-max-nt fornecem suporte para conexões named pipes no
Windows NT, 2000, XP e 2003. Se uma determinada instalação inclui vários programas de servidores,
escolhe-se um para ser executado entre os disponíveis. A configuração exacta dos recursos do MySQL
podem mudar ao longo do tempo, por isso sempre que actualizar para uma nova versão, é aconselhável
verificar a documentação. Tenha em mente a diferença entre um Server e um Host. O servidor é um
software (programa mysqld do servidor MySQL). As características do servidor incluem o número da
versão, se certas funcionalidades são incluídas ou excluídas, e assim por diante. O host é a máquina física
em que o programa servidor é executado. As características do host incluem a sua configuração de
hardware, o sistema operativo em execução na máquina, seus endereços de rede, e assim por diante.
Os programas cliente. Estes são os programas que você usa para se comunicar com o servidor e
manipular as informações nas bases de dados que o servidor gere. MySQL AB oferece vários programas
cliente. A lista a seguir descreve alguns deles:
1. MySQL Query Browser e o MySQL Administrator são interfaces gráficas front-end para o
servidor.
2. mysql é um programa de linha de comando que funciona como um front-end baseado em texto
para o servidor. É utilizado para a emissão de consultas e exibir os resultados de forma interactiva a
partir de uma janela de terminal.
3. Outros clientes de linha de comando incluem mysqlimport para importação de ficheiros de
dados, mysqldump para fazer backups, mysqladmin para administração de servidores, e
mysqlcheck para verificar a integridade dos ficheiros de base de dados.
Utilitários MySQL não-clientes. São programas que actuam de forma independente do servidor. Eles não
funcionam antes de estabelecer uma conexão com o servidor. myisamchk é um exemplo. Ele executa
operações de verificações e reparações das tabelas. Outro programa nesta categoria é myisampack, que
cria versões compactadas somente de leitura de tabelas MyISAM. Ambos utilitários funcionam acedendo
directamente aos ficheiros das tabelas MyISAM, independente da base de dados do servidor mysqld.
--------------x----------------x-------------------x----------------x------------------x---------------x----------------x--------------x---
MyISAM — Muito rápido. Motor baseado no armazenamento em disco sem suporte para transacções.
Oferece busca de texto completo, chaves empacotadas e é o motor de armazenamento padrão.
InnoDB — Transacção segura. Motor baseado no armazenamento em disco com bloqueio de linhas.
Recomendado para tabelas que necessitam suporte a transacções.
--------------x----------------x-------------------x----------------x------------------x---------------x----------------x--------------x---
--------------x----------------x-------------------x----------------x------------------x---------------x----------------x--------------x---
O MySQL possui uma característica um pouco diferente dos outros sistemas gerenciadores de base de
dados, uma vez que no MySQL é possível escolher o tipo da tabela no momento da criação da mesma. O
formato de armazenamento dos dados, bem como alguns recursos da base de dados são dependentes do
tipo de tabela escolhido.
A definição do tipo de tabela é feito através do comando CREATE TABLE, como mostrado a seguir:
CREATE TABLE teste ( id INT NOT NULL, texto CHAR(30) NOT NULL, PRIMARY KEY (id) ) TYPE=MyISAM;
No comando acima, TYPE=MyISAM, indica que a tabela criada será do tipo MyISAM, que é o valor default
caso não seja informado o TYPE. A partir da versão 4.0.18 você pode utilizar ENGINE como sinónimo de
TYPE. A seguir estão apresentados os tipos de tabelas existentes no MySQL:
1. MyISAM:
Este é o tipo de tabela padrão do MySQL. Caso não seja informado o tipo de tabela, o MySQL criará a tabela
do tipo MyISAM. O tipo de tabela default pode ser alterado incluindo-se no arquivo de configuração, a
opção descrita a seguir: default-table-type=tipo.
As tabelas MyISAM são armazenadas em 3 ficheiros: .FRM que armazena a definição da tabela, o ficheiro
.MYD que contém os dados e o .MYI contendo os índices. Estas tabelas são de grande desempenho para
leitura, uma vez que os seus índices são armazenados em árvores binárias balanceadas, o que provê um
ganho para o acesso às informações. O MyISAM não provê controlo de transacções (commit ou rollback) e
também não possui integridade referencial, isto é, ao incluir uma chave estrangeira com alguns constraints,
esta servirá apenas como documentação, mas as restrições não serão respeitadas pela base de dados.
Como as tabelas MyISAM são representadas por três ficheiros no modelo, existe, em alguns sistemas
operativos, restrições quanto ao tamanho destas tabelas. No Linux, por exemplo, existe a restrição de
2G/4GB por ficheiros. Com isto, uma tabela MyISAM poderia ter somente 2G/4GB de dados. Para superar
esta limitação foi introduzido na versão 4.1 a opção RAID_TYPE utilizada no CREATE TABLE, que permite ao
próprio MySQL dividir o armazenamento da tabela em vários ficheiros. Com isto, o tamanho da tabela
MyISAM não fica preso ao tamanho máximo de ficheiros do sistema operativo. O principal problema
encontrado com as tabelas MyISAM é que elas possuem um mecanismo de locks por tabela. Assim, todas
as vezes que há uma escrita na tabela, o MySQL precisa travar a tabela como um todo, o que bloqueia por
um instante o acesso à esta tabela, mesmo para processos que tentem aceder registos que estão sendo
modificados. Assim, é gerada uma fila de espera até que o lock seja liberado e os outros processos possam
ser executados. Por outro lado, estas tabelas são extremamente rápidas, devido à sua arquitetura
simplificada.
2. HEAP:
Tabelas HEAP são armazenadas em memória e por isto são extramente rápidas. Por outro lado o seu
conteúdo é volátil, uma vez que não são gravadas em disco. Caso haja uma queda do SGBD os dados destas
tabelas serão perdidos. Além disto, é necessário um processo para dar a carga inicial nos dados quando o
servidor de base de dados iniciar a sua execução. A principal aplicação das tabelas HEAP seria para tabelas
que são consultadas com muita frequência, mas que não sofrem muitas alterações (lookup tables).
3. MERGE:
As tabelas MERGE são colecções de tabelas MyISAM idênticas. Este recurso permite a divisão de uma
tabela grande em várias partes menores, e ainda assim permite acesso ao conteúdo de todas elas como se
fossem uma única tabela. O exemplo a seguir ilustra a criação de uma tabela MERGE:
CREATE TABLE t1 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20) );
CREATE TABLE t2 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20) );
INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1'); INSERT INTO t2 (message) VALUES ('Testing'),
('table'),('t2');
CREATE TABLE total ( a INT NOT NULL AUTO_INCREMENT, message CHAR(20), INDEX(a) )TYPE=MERGE
UNION=(t1,t2);
SELECT * FROM total;
a message
1 Testing
2 table
3 t1
1 Testing
2 table
3 t2
Percebam que as tabelas t1, t2 e total são idênticas e as duas primeiras são tabelas MyISAM (foi omitido o
TYPE no comando CREATE TABLE). Ao se submeter um SELECT na tabela total, você tem acesso ao
conteúdo das tabelas t1 e t2, simultaneamente. A principal vantagem da tabela MERGE é permitir a divisão
de tabelas grandes em tabelas pequenas, mais facilmente gerenciadas. Também permite superar as
limitações do sistema operativo em relação ao tamanho dos ficheiros, uma vez que a tabela seria dividida
em várias partes, onde cada parte poderia atingir o tamanho máximo de ficheiro. A desvantagem é que
podemos fazer apenas MERGE de tabelas MyISAM idênticas.
4. BDB:
O tipo de tabela BDB vem de BerkeleyDB, e é desenvolvido pela Sleepycat (http://www.sleepycat.com). O
BDB provê ao MySQL um manipulador de tabelas com controlo de transacção, isto é, você poderá utilizar
os comandos COMMIT e ROLLBACK, além de fornecer a recuperação automática de dados em caso de
queda do sistema. O BDB apresenta um mecanismo de lock em nível de página, onde apenas os dados de
uma mesma página ficarão bloqueados durante um perído de lock. Além disto, você poderá ter vários locks
activos numa única tabela BDB, uma vez que a tabela poderá ser constituída de várias páginas.
5. InnoDB:
O InnoDB é um tipo de tabela transaccional, desenvolvido pela InnoDBase Oy. A partir da versão 4.0 do
MySQL ele passa a ser parte integrada das distribuições do MySQL. O InnoDB apresenta, além da
capacidade transaccional, outros recursos importantes:
Integridade referencial, com implementação dos constraints SET NULL, SET DEFAULT,
RESTRICT e CASCADE;
Ferramenta de backup on-line (ferramenta comercial, não GPL);
Lock de registo, como Oracle, DB2, etc;
Níveis de isolamento;
Armazenamentos de dados em tablespace.
Por se tratar de um tipo de tabela com recursos mais avançados, requer mais espaço em
memória e disco, além de se apresentar, em determinadas situações, um pouco mais lento
que MyISAM. Apesar disto, o InnoDB tem se mostrado extremamente rápido se comparado
com outros SGBDs transaccionais.
A vantagem da utilização de tipos de tabela é que você poderá optar por utilizar um
determinado tipo ou outro dependendo dos requisitos exigidos pela sua aplicação. Por
exemplo, se a sua aplicação é apenas de consulta você pode optar pelo tipo MyISAM em vez
do InnoDB, com isto evita o overhead da transacção, obtendo um maior desempenho. É
importante lembrar que poderá utilizar vários tipos de tabelas em uma mesma base de dados.
Neste caso, deve-se tomar cuidado com a utilização de determinados recursos, por exemplo,
se tiver uma transacção envolvendo tabelas InnoDB e MyISAM e submeter um comando
ROLLBACK, apenas os comandos executados no InnoDB serão desfeitos, enquanto que os
comandos executados no MyISAM persistirão. A utilização do tipo de tabela correcto é um
factor chave para determinar o desempenho da sua aplicação.
--------------x----------------x-------------------x----------------x------------------x---------------x----------------x--------------x---
MySQL roda em computadores com sistemas operativos diferentes. Os programas cliente podem conectar-
se ao servidor na mesma máquina como em máquinas diferentes, e não precisam estar com os mesmos
sistemas operativos.
--host=host_name or -h host_name
Esta opção especifica a máquina onde o servidor MySQL está a ser executado. O valor pode ser um nome
ou um número IP. O localhost significa que o host é o computador local (ou seja, o computador no qual está
a ser executado o programa de cliente). No Unix, o localhost é tratado de forma especial. No Windows, o
valor “.” (ponto) também define o local host e é tratado de forma especial também. O valor da máquina
padrão é localhost.
--port=port_number or -P port_number
Esta opção indica o número da porta à qual se conectar no servidor hospedeiro. Ela se aplica apenas para
conexões TCP / IP. O número padrão da porta do MySQL é 3306.
--shared-memory-base-name=memory_name
Esta opção pode ser usada no Windows para especificar o nome da memória partilhada a ser usada em
uma conexão ao servidor local. O nome padrão de memória partilhada é MySQL (case sensitive).
--socket=socket_name or -S socket_name
Este nome da opção vem de seu uso original para especificar um ficheiro de soquete do domínio Unix. No
Unix, para uma conexão com o host localhost, um cliente se conecta ao servidor utilizando um ficheiro de
socket Unix. Esta opção especifica o caminho desse ficheiro. No Windows, a opção --socket é usada para
especificar um pipe nomeado. Para sistemas baseados no Windows-NT que suportam pipes nomeados, um
cliente pode conectar-se usando um pipe especificando “.” como nome da máquina. Neste caso, --socket
especifica o nome do pipe. Os nomes dos pipes não são case sensitive. Se esta opção for omitida, o padrão
para o caminho do ficheiro em Unix é /tmp/mysql.sock. O nome padrão do pipe em Windows é MySQL.
- Em Windows, um cliente pode estabelecer uma conexão de pipe nomeado para o servidor local,
especificando “.” como nome da máquina.
- Em Unix, o localhost é especial para o MySQL: Indica que o cliente deve se conectar ao servidor usando
um ficheiro de socket Unix. Neste caso, qualquer número de porta especificado com a opção --port é
ignorado.
- Para estabelecer explicitamente uma conexão TCP / IP para um servidor local, --protocol=tcp ou então
especificar um host 127.0.0.1 (o endereço da interface de loopback TCP/IP) ou o hostname ou IP actual do
servidor.
Existem duas opções para fornecer informações de identificação. Elas indicam o nome de utilizador e
palavra passe da conta que deseja usar para aceder ao servidor. O servidor rejeita as tentativas de conexão
a menos que sejam fornecidos valores para esses parâmetros que correspondam a uma conta MySQL que
está listada nas tabelas de privilégios do servidor.
--user=user_name or -u user_name
Esta opção especifica o nome de utilizador da conta MySQL. Para determinar qual conta aplicar, o servidor
usa o valor de nome em conjunto com o nome do servidor. Isto significa que pode haver diferentes contas
com o mesmo nome, que podem ser usadas para conexões a diferentes hosts. No Windows, o nome da
conta padrão do MySQL é ODBC. No Unix, os programas cliente usam seu nome de login do sistema como o
seu nome de usuário padrão do MySQL.
--password=pass_value or -ppass_value
Esta opção especifica a senha da conta MySQL. Não há senha padrão. Se omitir esta opção, a conta do
MySQL deve ser configurada para permitir conexões sem senha.
- Pode-se omitir o valor da senha após a opção. Isso difere de outras opções de parâmetros de conexão,
cada um dos quais exige um valor depois do nome da opção. Se omitir o valor da senha, o programa cliente
solicita a você interactivamente uma senha, como mostrado aqui:
Shell> mysql-p
Digite a senha:
Quando é exibido o prompt “Enter password:”, digite a senha e pressione Enter. A senha não é exibida
enquanto é digitada, para evitar que outras pessoas a vejam.
- Se utilizar a forma abreviada da opção de senha (-p) e dar o valor da senha na linha de comando, não deve
haver nenhum espaço entre o -p e o valor. Isto é, -ppass_val está correto, mas –p pass_val não é. Isso difere
da forma curta para outros opções de parâmetros de conexão, onde um espaço é permitido entre a opção
e a seu valor. (Por exemplo, -hhost_name e -h host_name são válidos.) Esta excepcional exigência de que
não haja espaço entre -p e o valor da senha é uma lógica necessária para permitir que o parâmetro de
opção seja omitido.
Se tiver uma senha especificada na opção do ficheiro, mas deseja conectar usando uma conta que não tem
senha, especificar -p ou --password na linha de comando sem uma senha e pressione Enter no prompt
Enter password:
Outra opção que afecta a conexão entre o cliente e o servidor é –compress (ou -C). Esta opção faz com que
os dados enviados entre o cliente e o servidor sejam compactados antes da transmissão e descompactados
após o recebimento. O resultado é uma redução no número de bytes enviados através da conexão, que
pode ser útil em redes lentas. O custo é a sobrecarga computacional adicional para o cliente e servidor para
executar a compressão e descompressão. --compress e -C não têm argumentos depois do nome da opção.
Alguns exemplos:
shell> mysql
Conexão ao servidor local via memória partilhada (só em Windows). Usando nome de utilizador e senha
padrão:
Opções em ficheiros são organizadas em grupos, com cada grupo precedido por uma linha [nome do grupo]
que o define. Normalmente, o nome do grupo é o nome do programa ao qual o grupo de opções se aplica.
Por exemplo, os grupos [mysql] e [mysqldump] são opções para serem usadas por mysql e mysqldump,
respectivamente. O grupo especial chamado [client], pode ser usado para especificar opções que todos os
programas clientes usem. Um uso comum para o grupo [client] é para especificar parâmetros de conexão,
pois normalmente conecta-se ao mesmo servidor, não importa qual programa cliente esteja a ser utilizado.
Para escrever uma opção em um ficheiro de opções, use a opção de formato longo que usaria na linha de
comando, mas omitindo os hífens. Se uma opção tem um valor, espaços são permitidos ao redor do sinal =,
algo que não é verdade para as opções especificadas na linha de comando. Aqui está um exemplo de um
ficheiro de opções:
[client]
host = myhost.example.com
compress
[mysql]
safe-updates
Neste exemplo, o grupo [client] especifica o nome do servidor e indica que o protocolo cliente/servidor
deve usar compressão para o tráfego enviado através da rede. Opções neste grupo se aplicam a todos os
clientes padrão. O grupo [mysql] aplica-se somente para o programa mysql. O grupo exemplificado indica
que o MySQL deve usar a opção --safe-updates. (mysql usa tanto as opções do grupo [cliente] como do
grupo [mysql], então ele irá usar todas as três opções definidas.)
O local onde um ficheiro de opções deve ser localizado depende do seu sistema operativo.
Os programas olham para cada um dos ficheiros de opções padrão e lêm o que existe. Não ocorre nenhum
erro se um determinado ficheiro não for encontrado. Os programas MySQL podem aceder as opções de
múltiplos ficheiros de opções. Para usar um ficheiros de opções, criá-lo como um ficheiro texto utilizando
um editor. Para criar ou modificar um ficheiro de opções, deve ter permissão de escrita para ele. Os
programas cliente só precisam de acesso de leitura.
Para dizer a um programa para ler uma opção especifica num ficheiro de opções, use a --defaults-file =
file_name como primeira opção na linha de comando. Por exemplo, para utilizar apenas o ficheiro C:\ my-
opts para o mysql e ignorar o ficheiro de opções padrão, chame o programa da seguinte forma:
Para dizer a um programa para ler uma opção especifica num ficheiro de opções, além de arquivos das
opções padrão, use a opção --defaults-extra-file = file_name como primeira opção na linha de comando.
Para dizer a um programa para ignorar todos os ficheiros de opções, especificar --no-defaults como
primeira opção na linha de comando.
Ficheiros de opções podem referenciar outros ficheiros a serem lidos usando as directivas !include e !
includedir:
- A linha !include file_name suspende o processamento actual. O ficheiro file_name é lido para opções
adicionais e, em seguida, o processamento recomeça.
- A linha !includedir dir_name é similar, excepto que procura-se em dir_name por ficheiros que tenham a
extensão .cnf (.cnf e .ini no Windows). Cada uma das opções desses ficheiros são lidas, e depois o
processamento continua.
Se a opção for especificada várias vezes, tanto no ficheiro de opções ou em múltiplos ficheiros, o valor da
opção que ocorrer por último tem precedência. As opções especificadas na linha de comando têm
precedência sobre as opções encontradas no ficheiro de opções.
Para o cliente mysql, um nome de base de dados pode ser dado na linha de comando, mas é opcional
porque pode-se indicar explicitamente o nome da base de dados para qualquer tabela quando emitir
consultas. Por exemplo, a seguinte declaração selecciona as linhas da tabela Country da base de dados
WORLD:
Para seleccionar ou alterar a base de dados padrão durante a execução do mysql, emitir uma instrução USE
db_name, onde db_name é o nome da base de dados a ser usada. A declaração seguinte define WORLD
como base de dados padrão:
A vantagem de seleccionar uma base de dados como padrão de uso é que em consultas posteriores pode-
se referir às tabelas sem ter que especificar o nome da BD. Por exemplo, com a BD WORLD seleccionada, as
seguintes instruções SELECT são equivalentes, mas a segunda é mais fácil, porque o nome da tabela não
precisa ser precedida do nome da BD:
--------------x----------------x-------------------x----------------x------------------x---------------x----------------x--------------x---
By default, MySQL is forgiving of illegal or improper data values and coerces them to legal values for
data entry. However, you can change the server SQL mode to select more traditional treatment of bad
values such that the server rejects them and aborts the statement in which they occur. See
Section 5.1.7, “Server SQL Modes”.
This section describes the default (forgiving) behavior of MySQL, as well as the strict SQL mode and
how it differs.
If you are not using strict mode, then whenever you insert an “incorrect” value into a column, such as a
NULL into a NOT NULL column or a too-large numeric value into a numeric column, MySQL sets the
column to the “best possible value” instead of producing an error: The following rules describe in more
detail how this works:
If you try to store an out of range value into a numeric column, MySQL Server instead stores
zero, the smallest possible value, or the largest possible value, whichever is closest to the
invalid value.
For strings, MySQL stores either the empty string or as much of the string as can be stored in
the column.
If you try to store a string that doesn't start with a number into a numeric column, MySQL Server
stores 0.
Invalid values for ENUM and SET columns are handled as described in Section 1.7.6.3, “ENUM
and SET Constraints”.
MySQL allows you to store certain incorrect date values into DATE and DATETIME columns
(such as '2000-02-31' or '2000-02-00'). The idea is that it is not the job of the SQL server
to validate dates. If MySQL can store a date value and retrieve exactly the same value, MySQL
stores it as given. If the date is totally wrong (outside the server's ability to store it), the special
“zero” date value '0000-00-00' is stored in the column instead.
If you try to store NULL into a column that doesn't take NULL values, an error occurs for single-
row INSERT statements. For multiple-row INSERT statements or for INSERT INTO ...
SELECT statements, MySQL Server stores the implicit default value for the column data type. In
general, this is 0 for numeric types, the empty string ('') for string types, and the “zero” value
for date and time types. Implicit default values are discussed in Section 10.1.4, “Data Type
Default Values”.
If an INSERT statement specifies no value for a column, MySQL inserts its default value if the
column definition includes an explicit DEFAULT clause. If the definition has no such DEFAULT
clause, MySQL inserts the implicit default value for the column data type.
The reason for using the preceding rules in non-strict mode is that we can't check these conditions until
the statement has begun executing. We can't just roll back if we encounter a problem after updating a
few rows, because the storage engine may not support rollback. The option of terminating the
statement is not that good; in this case, the update would be “half done,” which is probably the worst
possible scenario. In this case, it is better to “do the best you can” and then continue as if nothing
happened.
In MySQL 5.0.2 and up, you can select stricter treatment of input values by using the
STRICT_TRANS_TABLES or STRICT_ALL_TABLES SQL modes:
STRICT_TRANS_TABLES enables strict mode for transactional storage engines, and also to some extent
for non-transactional engines. It works like this:
For transactional storage engines, bad data values occurring anywhere in a statement cause
the statement to abort and roll back.
For non-transactional storage engines, a statement aborts if the error occurs in the first row to
be inserted or updated. (When the error occurs in the first row, the statement can be aborted to
leave the table unchanged, just as for a transactional table.) Errors in rows after the first do not
abort the statement, because the table has already been changed by the first row. Instead, bad
data values are adjusted and result in warnings rather than errors. In other words, with
STRICT_TRANS_TABLES, a wrong value causes MySQL to roll back all updates done so far, if
that can be done without changing the table. But once the table has been changed, further
errors result in adjustments and warnings.
For even stricter checking, enable STRICT_ALL_TABLES. This is the same as STRICT_TRANS_TABLES
except that for non-transactional storage engines, errors abort the statement even for bad data in rows
following the first row. This means that if an error occurs partway through a multiple-row insert or
update for a non-transactional table, a partial update results. Earlier rows are inserted or updated, but
those from the point of the error on are not. To avoid this for non-transactional tables, either use single-
row statements or else use STRICT_TRANS_TABLES if conversion warnings rather than errors are
acceptable. To avoid problems in the first place, do not use MySQL to check column content. It is safest
(and often faster) to let the application ensure that it passes only legal values to the database.
With either of the strict mode options, you can cause errors to be treated as warnings by using INSERT
IGNORE or UPDATE IGNORE rather than INSERT or UPDATE without IGNORE
--------------x----------------x-------------------x----------------x------------------x---------------x----------------x--------------x---
O modo de SQL é controlado através da variável de sistema sql_mode. Para atribuir um valor a esta
variável, use uma instrução SET. O valor deve ser uma string vazia, ou um ou mais nomes de modos
separados por vírgulas. Se o valor for vazio ou contiver mais do que um nome de modo, ele deve ser citado.
Se o valor contiver um nome de modo único, o valor citado é opcional. Os valores do modo SQL não são
case sensitive. Aqui estão alguns exemplos:
Alguns valores do modo SQL são modos compostos que realmente permitem um conjunto de modos.
Valores nesta categoria incluem ANSI e TRADITIONAL. Para ver os valores que consistem os modos
compostos, verifique o valor após a seguinte definição:
ANSI_QUOTES
Esta opção faz com que o MySql passe a tratar aspas duplas (“) como o carácter (‘). Isso faz com que as
aspas duplas não sejam consideradas para delimitar literais ou strings.
IGNORE_SPACE
Por padrão, as funções devem ser escritas sem espaço entre o nome da função e os parênteses. Esta opção
faz com que o MySql permita um espaço entre a função e os parênteses da função. Quando o comando
“SELECT count (*) from <<tabela>>“ sem esta opção, o MySql retorna um erro. Com esta opção activada, o
MySql retorna o resultado.
ERROR_FOR_DIVISION_BY_ZERO
Com esta opção, o MySql retorna um erro (quando em modo restrito) ou um aviso quando houver uma
divisão por zero ou quando o uso da função MOD tiver o segundo parâmetro como zero durante um INSERT
ou um UPDATE. Caso esta opção não esteja habilitada, o MySql retorna NULL.
STRICT_TRANS_TABLES, STRICT_ALL_TABLES
Estes valores permitem "modo restrito", que impõe certas restrições às quais os valores são aceitáveis
como entrada de dados. Por padrão, o MySQL “perdoa” a aceitação de valores em falta, fora do alcance
(outo f range) ou fora de formatos. Activar o modo restrito faz com que os valores que estejam fora do
padrão sejam tratados como erro. STRICT_TRANS_TABLES habilita o modo restrito para tabelas
transaccionais e STRICT_ALL_TABLES habilita modo restrito para todas as tabelas.
Perceba que apesar do comando ser executado com sucesso 3 warnings são mostrados
(o problema é que dificilmente sua aplicação trata esse tipo de resultado).
Quando verificamos quais são os warnings veja o resultado:
Mysql>show warnings;
+---------+------+-----------------------------------------------+
| Level | Code | Message |
+---------+------+-----------------------------------------------+
| Warning | 1264 | Out of range value for column 'col1' at row 5 |
| Warning | 1264 | Out of range value for column 'col1' at row 6 |
| Warning | 1264 | Out of range value for column 'col1' at row 7 |
+---------+------+-----------------------------------------------+
3 rows in set (0.00 sec)
Lendo essa saída você imaginaria o que o MySQL fez com as três linhas inseridas
que extrapolaram o limite do datatype?
TRADITIONAL
Faz com que o MySQL se comporte como um "tradicional" sistema de base de dados SQL. Uma descrição
simples deste modo é "dar um erro em vez de um aviso" ao inserir um valor incorrecto em uma coluna.
ANSI
Esta é um modo composto que faz o MySQL Server ser mais "ANSI-like." Isto é, ele permite
comportamentos mais parecidos com o padrão SQL, tais como ANSI_QUOTES (descrito anteriormente) e
PIPES_AS_CONCAT, que faz com que || seja tratado como concatenação em vez do operador lógico OR.