Ответ 1
Нет другого пути, я должен указать все дважды. Сначала для вставки, второй в случае обновления.
Я искал, но не нашел, возможно ли это.
У меня есть этот запрос 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)
Надеюсь, кто-то может сказать мне, что самый эффективный способ.
Нет другого пути, я должен указать все дважды. Сначала для вставки, второй в случае обновления.
Оператор 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
Однако это не работает так же, как "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`);
Вот решение вашей проблемы:
Я попытался решить проблему, подобную вашей, и я хочу предложить протестировать ее из простого аспекта.
Выполните следующие действия: Узнайте о простом решении.
Шаг 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`);
или, Создайте индекс из двух столбцов из графического интерфейса следующим образом:
Шаг 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';
Возможно, вам захочется использовать синтаксис REPLACE INTO
, но при повторном ключе PRIMARY/UNIQUE следует предупредить DELETES строку и INSERTS новую.
Вам не нужно будет повторно указывать все поля. Однако вы должны учитывать возможное снижение производительности (в зависимости от дизайна вашей таблицы).
На всякий случай, когда вы можете использовать язык сценариев для подготовки 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;
вы можете использовать ignore insert для такого случая, он будет игнорировать, если он получает дубликаты записей INSERT IGNORE...; - без ключа DUPLICATE