При дублировании ключа обновление такое же, как insert
Я искал вокруг, но не нашел, если это возможно.
у меня есть этот запрос 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!
id=LAST_INSERT_ID(id)
Я надеюсь, что кто-нибудь может сказать мне, какой самый эффективный способ.
7 ответов
на UPDATE
оператор задается так, что старые поля могут быть обновлены до нового значения. Если ваши старые значения совпадают с новыми, зачем вам в любом случае обновлять их?
например. если ваши колонки a
to 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
однако он не работает так же, как "при дублировании обновления"
Он удаляет старую строку, которая конфликтует с новой строкой, а затем вставляет новую строку. Пока у вас нет первичного ключа в таблице, это было бы хорошо, но если вы это сделаете, то если любая другая таблица ссылается на этот первичный ключ
-
вы не можете ссылайтесь на значения в старых строках, чтобы вы не могли сделать эквивалент
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;
Шаг 2: создать индекс из двух колонок чтобы предотвратить дублирование данных с помощью следующего SQL Запрос:
ALTER TABLE `user` ADD INDEX no_duplicate (`username`, `password`);
или создайте индекс из двух столбцов из GUI следующим образом:
Шаг 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';
на случай, если вы можете использовать язык сценариев для подготовки 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 для такого случая, он будет игнорировать, если он получит дубликаты записей ВСТАВИТЬ ИГНОРИРОВАТЬ ... ; -- без дубликата ключа