Código de erro do MySQL: 1175 durante UPDATE no MySQL Workbench


817

Estou tentando atualizar a coluna visitedpara fornecer o valor 1. Uso o ambiente de trabalho MySQL e estou escrevendo a instrução no editor SQL de dentro do ambiente de trabalho. Estou escrevendo o seguinte comando:

UPDATE tablename SET columnname=1;

Dá-me o seguinte erro:

Você está usando o modo de atualização segura e tentou atualizar uma tabela sem WHERE que usa uma coluna KEY. Para desativar o modo de segurança, alterne a opção ....

Segui as instruções e desmarquei a safe updateopção no Editmenu Preferencesentão SQL Editor. O mesmo erro ainda aparece e não consigo atualizar esse valor. Por favor, me diga o que está errado?


4
Você está ciente de que isso atualizará todas as linhas da sua tabela onde visitou = 0 para se tornar visitado = 1? É isso que voce quer?
22812 Mark Byers

23
Após desmarcar "Atualizações seguras", siga a etapa abaixo: Consulta -> Reconectar ao servidor. Agora executar a consulta
Ripon Al Wasim

5
Você deve reconectar-se ao MySQL Server (reinicie a conexão MySQL) antes que esta alteração tenha efeito.
Philip Olson

Respostas:


1613

Parece que sua sessão do MySql possui a opção de atualizações seguras definida. Isso significa que você não pode atualizar ou excluir registros sem especificar uma chave (por exemplo primary key) na cláusula where.

Tentar:

SET SQL_SAFE_UPDATES = 0;

Ou você pode modificar sua consulta para seguir a regra (use primary keyin where clause).


Mencionei que já desabilitei a opção de atualização segura da GUI, que tem o mesmo efeito que a identificação digitada no comando. No entanto, obrigado pela sua resposta, mas eu já respondi minha pergunta. Verifique minha resposta para saber qual foi o problema.
Júri A

8
Depois de alterar a opção na GUI, é necessário reconectar-se ao banco de dados para que a configuração seja definida corretamente.
Tim Koscielski

31
Lembre-se de voltar atrás SET SQL_SAFE_UPDATES = 1quando terminar, pois é um recurso de segurança que vale a pena.
StockB

4
Não concordo com o StockB ... Talvez você queira continuar enquanto melhora o uso do SQL ... mas depois de saber o que está fazendo ... essa coisa é completamente inútil. Você não deveria estar desenvolvendo suas coisas em um servidor de produção de qualquer maneira, mesmo que você estrague tudo, a única coisa que você deve quebrar é o seu servidor de desenvolvimento .. o qual ninguém se importa.
Mathieu Turcotte

3
Só vim dizer que pesquisei este post 20 vezes nos últimos 6 meses, pois sempre havia essa opção falsa há 11 anos, mas agora estou trabalhando em uma empresa com esse conjunto de verdade no desenvolvimento e produção. Há muitos motivos para defini-lo como 0 por padrão, por exemplo, ao desenvolver recursos independentes que você pode exportar diretamente para o csv e marcá-lo como exportado ou algo semelhante. Outras vezes, é irritante devido a atualizações globais, que obviamente não possuem filtro pk. Eu vejo isso mais como uma proteção noob do que um recurso realmente útil.
JoelBonetR

454

Siga as etapas a seguir antes de executar o comando UPDATE: No MySQL Workbench

  1. Vá para Edit->Preferences
  2. Clique na "SQL Editor"guia e uncheck"Atualizações seguras"check box
  3. Query-> Reconnect to Server // logout e, em seguida, faça login
  4. Agora execute sua consulta SQL

ps, Não há necessidade de reiniciar o daemon MySQL!


20
Para a versão 6.3 etapa 2 deve ser "Sql Editor", em vez de "Sql Queries"e, em seguida, há uma caixa de seleção na parte inferior para"Safe Updates"
meconroy

1
se é uma coisa de uma vez eu sugiro que você ligá-lo novamente, pois isso faz com que seja muito fácil de regiamente estragar seus dados se você não tiver cuidado
Frankenmint

2
obrigado Conroy. Por um tempo eu não pude ver aquela caixa. Eu apenas tive que aumentar a janela.
Arn-arn

Talvez eles se mudaram, mas no MySQL Workbench 6.0, é em "SQL Queries", não "Editor de SQL"
MPelletier

1
sim mesmo aqui, tive que rolar um pouco para baixo para vê-lo.
Elon Zito

167
SET SQL_SAFE_UPDATES=0;
UPDATE tablename SET columnname=1;
SET SQL_SAFE_UPDATES=1;

4
infelizmente, as outras soluções baseadas em consulta não funcionaram para mim. Mas este fez! Compreendemos que você tenha adicionado uma linha para ativar novamente as atualizações seguras.
SherylHohman

1
Eu realmente gosto deste, pois provavelmente é o mais geral de todos, mantendo a segurança.
Nae

117

Não há necessidade de definir SQL_SAFE_UPDATES como 0 , eu realmente o desencorajaria a fazê-lo dessa maneira. SAFE_UPDATES está ativado por padrão por um RAZÃO. Você pode dirigir um carro sem cintos de segurança e outras coisas, se você entende o que quero dizer;) Basta adicionar na cláusula WHERE um valor KEY que corresponda a tudo, como uma chave primária em comparação com 0, portanto, em vez de escrever:

UPDATE customers SET countryCode = 'USA'
    WHERE country = 'USA';               -- which gives the error, you just write:

UPDATE customers SET countryCode = 'USA'
    WHERE (country = 'USA' AND customerNumber <> 0); -- Because customerNumber is a primary key you got no error 1175 any more.

Agora você pode ter certeza de que todos os registros são (SEMPRE) atualizados conforme o esperado.


3
Isso é genial!
Amos Long

resposta apreciada: +1
Asif Raza

2
Haha, isso é um bom truque. Eu usei WHERE id > 0como um truque nessa linha.
Csaba Toth

Não funciona para mim, continua mostrando a mesma mensagem. Eu o resolvi desativando o modo de atualização segura por: -Editar -> Preferências -> Editor de Sql e desmarque a opção Atualização segura.
Abdelhadi Lahlou 20/05/19

2
Como isso está realmente tornando as coisas mais seguras?
Matt Messersmith

107

Tudo o que é necessário é: Inicie uma nova consulta e execute:

SET SQL_SAFE_UPDATES = 0;

Em seguida: Execute a consulta que você estava tentando executar que não estava funcionando anteriormente.


7
Bem-vindo ao SO, leia a página do tour e a página de ajuda , e evite postar respostas como essa porque muitas respostas abaixo dizem exatamente a mesma coisa e foram postadas meses atrás
WOUNDEDStevenJones

1
Você também pode ativar esta opção novamente após executar a consulta.
KTA

O que essa resposta adiciona? Você acabou de postar a mesma coisa que Habibillah, mais de dois anos depois. Tentando colher karma?
Luc


66

Código de erro: 1175. Você está usando o modo de atualização segura e tentou atualizar uma tabela sem um WHERE que usa uma coluna KEY Para desativar o modo de segurança, alterne a opção em Preferências -> Editor SQL e reconecte-se.

Desative temporariamente o "Modo de atualização segura"

SET SQL_SAFE_UPDATES = 0;
UPDATE options SET title= 'kiemvieclam24h' WHERE url = 'http://kiemvieclam24h.net';
SET SQL_SAFE_UPDATES = 1;

Desative o "Modo de atualização segura" para sempre

Mysql workbench 8.0:

MySQL Workbench => [ Edit ] => [ Preferences ] -> [ SQL Editor ] -> Uncheck "Safe Updates"

insira a descrição da imagem aqui A versão antiga pode:

MySQL Workbench => [Edit] => [Preferences] => [SQL Queries]

41
  1. Preferências ...
  2. "Atualizações seguras" ...
  3. Reinicie o servidor

Preferências ...

Atualizações seguras Reinicie o servidor


Este deve ter sido a resposta aceita .it é uma pena que não foi
ErrorrrDetector

1
Você não precisa reiniciar o servidor. Deve ser suficiente simplesmente fechar e reabrir a conexão.
Marc L.

1
No MAC, as preferências estão no menu superior do MySQLWorkbench.
Zwitterion

36
SET SQL_SAFE_UPDATES=0;

OU

Vamos para Edit --> Preferences

Clique na SQL Queries guia e desmarque a Safe Updates caixa de seleção

Query --> Reconnect to Server

Agora execute sua consulta sql



20

No WorkBench, eu o resolvi desativando o modo de atualização segura:

-Editar -> Preferências -> Editor de Sql e desmarque Atualização segura.


7
Isso funciona, mas tive que reiniciar o MySQL Workbench.
Lanil Marasinghe

17

Eu encontrei a resposta. O problema é que eu tenho que preceder o nome da tabela com o nome do esquema. ou seja, o comando deve ser:

UPDATE schemaname.tablename SET columnname=1;

Obrigado a todos.


5
Você pode evitar mencionar o nome do esquema selecionando esquema no painel esquerdo. Seleção de esquema no meio painel esquerdo você estiver usando o esquema / banco de dados selecionado
Ripon Al Wasim

10
Esta não é a resposta para resolver o problema descrito na pergunta (e no título). Você deve marcar outro como aceito.
T30

Eu tentei com schemaname mas recebendo mesmo erro, atualizar qms-active-dbconjunto de marcadores .gh_table = '1660_207100000001000'
Code_Mode

3
Esta não é a resposta!
Ezequiel Victor

1
resposta errada, resposta correta é respondida por Habibillah (abaixo)
hariharan s

14

No MySQL Workbech versão 6.2, não sai das SQLQueriesopções de Preferências .

Nesse caso, é possível usar: SET SQL_SAFE_UPDATES=0;


1
Existe, mas a opção está em "SQL Editor" agora.
Philip Olson

Não vejo essa opção. Por favor, você pode obter uma captura de tela. Obrigado
ferdiado

Abra Preferências -> guia SQL Editor -> Na parte inferior. Uma versão 6.2-beta não possuía essa opção, então talvez você precise atualizar para a 6.2.3 ou superior.
Philip Olson

minha versão é 6.3, está em -> Editor de SQL -> Outros
tyan

12

A solução mais simples é definir o limite de linhas e executar. Isso é feito para fins de segurança.


2
+1 nesta solução. Exclua da TABELA onde o limite da coluna = 'xyz' 9999999999
FlyingZebra1 14/02

2
Esta resposta deve ser a resposta aceita, porque é a maneira menos insegura.
Julian

7

Como a pergunta foi respondida e não teve nada a ver com atualizações seguras, esse pode ser o lugar errado; Vou postar apenas para adicionar informações.

Tentei ser um bom cidadão e modifiquei a consulta para usar uma tabela temporária de IDs que seria atualizada:

create temporary table ids ( id int )
    select id from prime_table where condition = true;
update prime_table set field1 = '' where id in (select id from ids);

Fracasso. Modificou a atualização para:

update prime_table set field1 = '' where id <> 0 and id in (select id from ids);

Isso funcionou. Bem, caramba - se estou sempre adicionando a chave where <> 0 para contornar a verificação de atualização segura, ou até mesmo definir SQL_SAFE_UPDATE = 0, perdi a verificação na minha consulta. Eu também poderia simplesmente desativar a opção permanentemente. Suponho que isso exclua e atualize um processo de duas etapas em vez de um .. mas se você digitar rápido o suficiente e parar de pensar que a chave é especial, mas apenas um incômodo ..


4

É verdade que isso é inútil para a maioria dos exemplos. Mas, finalmente, cheguei à seguinte declaração e ela funciona bem:

update tablename  set column1 = '' where tablename .id = (select id from tablename2 where tablename2.column2 = 'xyz');

3

Isso é para Mac, mas deve ser o mesmo para outros sistemas operacionais, exceto o local das preferências.

O erro que obtemos quando tentamos uma DELETEoperação insegura

Clique nas preferências quando receber este erro

Na nova janela, desmarque a opção Safe updates

Desmarque as atualizações seguras

Em seguida, feche e reabra a conexão. Não há necessidade de reiniciar o serviço.

Agora vamos tentar DELETEnovamente com resultados bem-sucedidos.

insira a descrição da imagem aqui

Então, o que há com essas atualizações seguras? Não é uma coisa má. É o que o MySql diz sobre isso.

Usando a --safe-updatesopção

Para iniciantes, uma opção útil de inicialização é --safe-updates(ou --i-am-a-dummy, que tem o mesmo efeito). É útil nos casos em que você pode ter emitido uma DELETE FROM tbl_namedeclaração, mas esqueceu a WHEREcláusula. Normalmente, essa instrução exclui todas as linhas da tabela. Com --safe-updates, você pode excluir linhas apenas especificando os valores-chave que os identificam. Isso ajuda a evitar acidentes.

Quando você usa a --safe-updatesopção, o mysql emite a seguinte instrução quando se conecta ao servidor MySQL:

SET sql_safe_updates=1, sql_select_limit=1000, sql_max_join_size=1000000;

É seguro ativar essa opção enquanto você lida com o banco de dados de produção. Caso contrário, você deve ter muito cuidado para não excluir acidentalmente dados importantes.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.