Нужна помощь в запросе MySql ВСТАВИТЬ, ЕСЛИ НЕ СУЩЕСТВУЕТ В противном случае ОБНОВЛЕНИЕ

Мне нужна небольшая помощь, я хотел бы обновить существующую запись, если она уже существует в таблице, иначе вставьте новую запись. Я не использую столбец первичного ключа в Where пункт.

Каждый раз вставляйте новую запись в таблицу с одинаковыми значениями столбца 1 и 2.

Я получил несколько ответов, а также использовать ЗАМЕНА. Но REPLACE будет работать в случае уникального / первичного ключа, в противном случае будет вставлена ​​новая запись.

Я использовал запрос ниже

Способ 1:

IF EXISTS (select * from mytable3 WHERE field1 = 'A') THEN
BEGIN
UPDATE mytable3
SET (field1 ='A', field2 = 'DD')
WHERE field1 = 'A'
END
ELSE
BEGIN
INSERT INTO  mytable3 (field1, field2) VALUES ('A', 'DD')
END

Способ 2:

REPLACE mytable3 (field1, field2) VALUES ('A', 'DD');

Структура таблицы:

CREATE TABLE mytable3
(
users int(11) NOT NULL AUTO_INCREMENT,
field1 varchar(10),
field2 varchar(10),
PRIMARY KEY(users)
);

insert into mytable3 (field1, field2) values('A', 'AA');
insert into mytable3 (field1, field2) values('B', 'BB');
insert into mytable3 (field1, field2) values('C', 'CC');

Заметка: каждый раз вставлять новую запись в таблицу с одинаковыми значениями поля 1 и 2

————————- Оригинальный вопрос ——————

Я изо всех сил пытаюсь написать MySql-запрос для вставки новых записей, если они не существуют, в противном случае обновите существующую запись. Но я сталкиваюсь с синтаксической ошибкой, как показано ниже:

Код ошибки: 1064. У вас ошибка в синтаксисе SQL; проверить
руководство, которое соответствует вашей версии сервера MySQL для права
синтаксис для использования вблизи ‘ЕСЛИ СУЩЕСТВУЕТ (ВЫБЕРИТЕ * ОТ Wnduty.parcel-status-log
ГДЕ parcel-id = 1 И `sh ‘в строке 1

Запрос SQl, как показано ниже:

IF EXISTS(SELECT * FROM wnduty.`parcel-status-log` WHERE `parcel-id` = 1 AND `shipping-status-id` = 4)
THEN
BEGIN
UPDATE wnduty.`parcel-status-log`  SET (`status-date` ='2016-06-10 10:41:58', `is-synced`= 3)
WHERE `parcel-id` = 1 AND `shipping-status-id` = 4
END
ELSE
BEGIN
INSERT INTO wnduty.`parcel-status-log`  (`parcel-id`,`shipping-status-id`, `is-synced`,`status-date`)
values(1, 4, 1, '2016-06-10 10:41:58')
END
END IF

Я также попытался по запросу ниже, но все еще синтаксическая ошибка ..

INSERT INTO wnduty.`parcel-status-log` (`parcel-id`, `shipping-status-id`, `is-synced`, `status-date`) values(1, 4, 1, '2016-06-10 10:41:57')
ON DUPLICATE KEY UPDATE
`status-date` ='2016-06-13 11:41:58',`is-synced` = 3, `shipping-status-id` = 4 ;

Я использую версию MySql, как показано ниже:

  • innodb_version 5.7.12
  • протокол_версии 10
  • version_compile_os Win64

0

Решение

Вы можете использовать UPDATE INTO с тем же синтаксисом, что и INSERT INTO, и если запись является дубликатом любого из уникальных ключей в таблице, она обновит запись, в противном случае она будет вставлена ​​с использованием того же оператора SQL.

0

Другие решения

Просто используйте ЗАМЕНА вместо INSERT, он делает именно то, что вы ищете …

INSERT INTO wnduty.parcel-status-log ... [/ NOEDIT]

REPLACE wnduty.parcel-status-log ... [/ NOEDIT]

От MySQL человек:

REPLACE работает точно так же, как INSERT, за исключением того, что если старая строка в таблице имеет то же значение, что и новая строка для PRIMARY KEY или UNIQUE индекса, старая строка удаляется перед вставкой новой строки. См. Раздел 14.2.5, «Синтаксис INSERT».

Пример полной замены:

mysql> CREATE TABLE mytable ( users TINYINT(1), field varchar(10), PRIMARY KEY(users));
mysql> insert into mytable values(1, 'A');
mysql> insert into mytable values(2, 'B');
mysql> insert into mytable values(3, 'C');

Теперь замените строку новым значением, независимо от того, существует оно или нет:

mysql> REPLACE mytable (users, field) VALUES (2, "New Value");
mysql> REPLACE mytable (users, field) VALUES (4, "D");
0

По вопросам рекламы [email protected]