При обновлении дубликата ключа то же самое, что и вставка


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

у меня есть этот запрос 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)

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

7 123

7 ответов:

The 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() получает значение.

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

однако это не работает совсем так же, как "на дубликат обновления"

  1. Он удаляет старую строку, которая конфликтует с новой строкой, а затем вставляет новую строку. Пока у вас нет первичного ключа в таблице, это было бы хорошо, но если вы это сделаете, то если любая другая таблица ссылается на этот первичный ключ

  2. вы не можете ссылка на значения в старых строках, так что вы не можете сделать эквивалент

    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`);

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

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

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

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

Шаг 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;

A table <code>user</code> with data

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

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

или создать индекс из двух столбцов из GUI следующим образом: Create index from GUI Select columns to create index Indexes of table <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';

Table <code>user</code> after running above query

если вы можете использовать язык сценариев для подготовки 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;

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

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

предостережения:

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

вы можете использовать insert ignore для такого случая, он будет игнорировать, если он получает повторяющиеся записи ВСТАВИТЬ ИГНОРИРОВАТЬ ... ; -- без дубликата ключа