Подтвердить что ты не робот

Обновление дублирующего ключа так же, как вставка

Я искал, но не нашел, возможно ли это.

У меня есть этот запрос MySQL:

INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8)

Идентификатор поля имеет "уникальный индекс", поэтому их не должно быть двух. Теперь, если тот же идентификатор уже присутствует в базе данных, я бы хотел его обновить. Но действительно ли мне нужно снова указать все это поле, например:

INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8) 
ON DUPLICATE KEY UPDATE a=2,b=3,c=4,d=5,e=6,f=7,g=8

Или:

INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8) 
ON DUPLICATE KEY UPDATE a=VALUES(a),b=VALUES(b),c=VALUES(c),d=VALUES(d),e=VALUES(e),f=VALUES(f),g=VALUES(g)

Я уже указал все, что уже было в вставке...

Дополнительная заметка, я бы хотел использовать эту работу, чтобы получить идентификатор!

id=LAST_INSERT_ID(id)

Надеюсь, кто-то может сказать мне, что самый эффективный способ.

4b9b3361

Ответ 1

Нет другого пути, я должен указать все дважды. Сначала для вставки, второй в случае обновления.

Ответ 2

Оператор UPDATE задается так, что старые поля могут обновляться до нового значения. Если ваши старые значения совпадают с вашими новыми, зачем вам его обновлять в любом случае?

Например, если ваши столбцы a до g уже установлены как 2 - 8; нет необходимости повторно обновлять его.

В качестве альтернативы вы можете использовать:

INSERT INTO table (id,a,b,c,d,e,f,g)
VALUES (1,2,3,4,5,6,7,8) 
ON DUPLICATE KEY
    UPDATE a=a, b=b, c=c, d=d, e=e, f=f, g=g;

Получить id из LAST_INSERT_ID; вам нужно указать серверное приложение, которое вы используете для него.

Для LuaSQL a conn:getlastautoid() выбирает значение.

Ответ 3

Существует специальное расширение MySQL для SQL, которое может быть тем, что вы хотите - REPLACE INTO

Однако это не работает так же, как "ON DUPLICATE UPDATE"

  • Удаляет старую строку, которая сталкивается с новой строкой, а затем вставляет новую строку. До тех пор, пока у вас нет первичного ключа в таблице, это будет хорошо, но если вы это сделаете, то если какая-либо другая таблица ссылается на этот первичный ключ

  • Вы не можете ссылаться на значения в старых строках, чтобы вы не могли сделать эквивалент

    INSERT INTO mytable (id, a, b, c) values ( 1, 2, 3, 4) 
    ON DUPLICATE KEY UPDATE
    id=1, a=2, b=3, c=c + 1;
    

Я хотел бы использовать эту работу, чтобы получить идентификатор!

Это должно работать — last_insert_id() должен иметь правильное значение, пока ваш первичный ключ будет автоматически увеличиваться.

Однако, как я уже сказал, если вы действительно используете этот первичный ключ в других таблицах, REPLACE INTO, вероятно, не будет вам приемлемым, поскольку он удаляет старую строку, которая сталкивается с помощью уникального ключа.

Кто-то еще предложенный до, вы можете уменьшить количество ввода:

INSERT INTO `tableName` (`a`,`b`,`c`) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE `a`=VALUES(`a`), `b`=VALUES(`b`), `c`=VALUES(`c`);

Ответ 4

Вот решение вашей проблемы:

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

Выполните следующие действия: Узнайте о простом решении.

Шаг 1: Создайте схему таблицы, используя этот SQL-запрос:

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(30) NOT NULL,
  `password` varchar(32) NOT NULL,
  `status` tinyint(1) DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `no_duplicate` (`username`,`password`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;

Таблица <code> user </code> с данными

Шаг 2: Создайте индекс из двух столбцов, чтобы предотвратить дублирование данных с помощью следующего SQL-запроса:

ALTER TABLE `user` ADD INDEX no_duplicate (`username`, `password`);

или, Создайте индекс из двух столбцов из графического интерфейса следующим образом: Создать индекс из GUI Выбрать столбцы для создания индекса Индексы таблицы <code> user </code>

Шаг 3: Обновить, если существует, вставить, если не, используя следующие запросы:

INSERT INTO `user`(`username`, `password`) VALUES ('ersks','Nepal') ON DUPLICATE KEY UPDATE `username`='master',`password`='Nepal';

INSERT INTO `user`(`username`, `password`) VALUES ('master','Nepal') ON DUPLICATE KEY UPDATE `username`='ersks',`password`='Nepal';

Таблица < код > пользователь </code> после выполнения выше запроса

Ответ 5

Возможно, вам захочется использовать синтаксис REPLACE INTO, но при повторном ключе PRIMARY/UNIQUE следует предупредить DELETES строку и INSERTS новую.

Вам не нужно будет повторно указывать все поля. Однако вы должны учитывать возможное снижение производительности (в зависимости от дизайна вашей таблицы).

Предостережение:

  • Если у вас есть первичный ключ AUTO_INCREMENT, ему будет предоставлен новый
  • Индексы, вероятно, должны быть обновлены

Ответ 6

На всякий случай, когда вы можете использовать язык сценариев для подготовки SQL-запросов, вы можете повторно использовать пары field = value, используя SET вместо (a,b,c) VALUES(a,b,c).

Пример с PHP:

$pairs = "a=$a,b=$b,c=$c";
$query = "INSERT INTO $table SET $pairs ON DUPLICATE KEY UPDATE $pairs";

Пример таблицы:

CREATE TABLE IF NOT EXISTS `tester` (
  `a` int(11) NOT NULL,
  `b` varchar(50) NOT NULL,
  `c` text NOT NULL,
  UNIQUE KEY `a` (`a`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Ответ 7

вы можете использовать ignore insert для такого случая, он будет игнорировать, если он получает дубликаты записей INSERT IGNORE...; - без ключа DUPLICATE