MySQL Вы используете безопасный режим обновления и пытаетесь обновить таблицу без WHERE. - PullRequest
0 голосов
/ 21 января 2020

Я получаю это сообщение об ошибке от mySQL

"Код ошибки: 1175. Вы используете безопасный режим обновления и пытались обновить таблицу без WHERE, в котором используется столбец KEY Чтобы отключить безопасный режим, переключите параметр в «Предпочтения» -> SQL «Редактор» и переподключите. »

Я использую следующий запрос:

 UPDATE table1 a INNER JOIN table2 asa ON a.ID = asa.Table1Id SET a.ReferenceID = asa.ReferenceID WHERE a.ID > 0 AND asa.ID > 0 

У меня есть предложения where для обеих таблиц идентификаторы, которые являются первичным ключом для обеих таблиц.

Отключение SQL_SAFE_UPDATES не является опцией.

Редактировать: MySQL версия v5.6

Ответы [ 2 ]

0 голосов
/ 21 января 2020

Кажется, что MySQL 5.6 ограничено выполнением оператора UPDATE вместе с JOIN

Так что вместо

UPDATE table1 a
INNER JOIN table2 asa
ON a.ID = asa.Table1Id
SET a.ReferenceID = asa.ReferenceID
WHERE a.ID > 0 AND asa.ID > 0

Вам придется написать столько запросов, сколько необходимо, например:

UPDATE table1 a
SET a.ReferenceID = <The corresponding value in table 2>
WHERE a.ID = <The corresponding ID>

Это довольно раздражает при наборе, можно использовать динамический c SQL для построения запросов на обновление:

SELECT CONCAT('UPDATE table1 a SET a.ReferenceID = ', asa.ReferenceID, ' WHERE a.ID = ', t.ID, ';')
FROM table1 t
INNER JOIN table2 asa
ON t.ID = asa.Table1Id;

Например :

Схема (MySQL v5.6)

CREATE TABLE test
(
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    foo VARCHAR(255)
);

CREATE TABLE test2
(
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    id_test INT NOT NULL,
    foo VARCHAR(255),
    FOREIGN KEY (id_test) REFERENCES test(id)
);

INSERT INTO test (foo) VALUES ('hello'), ('world');

INSERT INTO test2 (id_test, foo) VALUES (1, 'bar'), (2, 'baz');

Запрос # 1

SELECT CONCAT('UPDATE test t SET t.foo = ''', t2.foo, ''' WHERE t.id = ', t.id, ';') AS 'sql query'
FROM test t
INNER JOIN test2 t2
ON t.id = t2.id_test;

Это выводит:

UPDATE test t SET t.foo = 'bar' WHERE t.id = 1;
UPDATE test t SET t.foo = 'baz' WHERE t.id = 2;

Теперь вывод можно использовать для ручного обновления строк различий


Просмотр в DB Fiddle

0 голосов
/ 21 января 2020

Даже если вы используете KEYS, я думаю, KEYS не используется должным образом . MySQL документация говорит.

Если эта переменная включена, операторы UPDATE и DELETE, которые не используют ключ в предложении WHERE или предложении LIMIT, выдают ошибку. Это позволяет отлавливать операторы UPDATE и DELETE, если ключи не используются должным образом , и это, вероятно, приведет к изменению или удалению большого количества строк.

Ваш запрос ниже повлияет на то же количество строк даже при WHERE условиях. Я предполагаю, что все значения ID больше, чем 0 верно? Если это так, то это и есть причина вашей ошибки.

 UPDATE table1 a 
 INNER JOIN table2 asa 
 ON a.ID = asa.Table1Id 
 SET a.ReferenceID = asa.ReferenceID 
 --WHERE a.ID > 0 AND asa.ID > 0 

Один из предложенных способов SET SQL_SAFE_UPDATES=0; (отключите и попробуйте). Или попробуйте уточнить условие WHERE. Также вы можете использовать LIMIT, если это одна таблица.

...