我想要向数据库表中添加一行数据,但如果已经存在具有相同唯一键的行,则我希望更新该行。
例如:
INSERT INTO table_name (ID, NAME, AGE) VALUES(1, "A", 19);
假设唯一键值是ID
,在我的数据库中有一行ID=1
。那么,在这种情况下,我希望使用这些值来更新该行数据。通常这将引发一个错误。
如果我使用INSERT IGNORE
,它会忽略错误,但仍然不会更新数据。
我想要向数据库表中添加一行数据,但如果已经存在具有相同唯一键的行,则我希望更新该行。
例如:
INSERT INTO table_name (ID, NAME, AGE) VALUES(1, "A", 19);
假设唯一键值是ID
,在我的数据库中有一行ID=1
。那么,在这种情况下,我希望使用这些值来更新该行数据。通常这将引发一个错误。
如果我使用INSERT IGNORE
,它会忽略错误,但仍然不会更新数据。
使用 INSERT ... ON DUPLICATE KEY UPDATE
查询:
INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE
name="A", age=19
ON DUPLICATE KEY UPDATE
中的更新会使受影响的行数增加2。如果实际上没有更新任何内容(与常规的UPDATE
相同),则报告0。 - VatevON DUPLICATE KEY UPDATE
在更新时会导致自增量递增,这使得如果您每天需要执行数百或数千个此类查询,则几乎无法使用,因为即使没有添加新行,自增量也会每次稳定地增加 x 行。 - twhitney参考 REPLACE
:
REPLACE
像INSERT
一样工作,但是如果表中的旧行与新行在PRIMARY KEY
或UNIQUE
索引上有相同的值,则会先删除旧行,再插入新行。
例如:
REPLACE INTO `tablename` (`id`, `name`, `age`) VALUES (1, "A", 19)
在使用批量插入时,请使用以下语法:
INSERT INTO TABLE (id, name, age) VALUES (1, "A", 19), (2, "B", 17), (3, "C", 22)
ON DUPLICATE KEY UPDATE
name = VALUES (name),
...
VALUES(name)
无法工作,你可以尝试 name = 'name_value',...;
- Son Pham无论哪种解决方案都可以解决您的问题:
INSERT IGNORE INTO table (id, name, age) VALUES (1, "A", 19);
或者INSERT INTO TABLE (id, name, age) VALUES(1, "A", 19)
ON DUPLICATE KEY UPDATE NAME = "A", AGE = 19;
或者REPLACE INTO table (id, name, age) VALUES(1, "A", 19);
试试这个:
INSERT INTO table (id,name,age) VALUES('1','Mohammad','21') ON DUPLICATE KEY UPDATE name='Mohammad',age='21'
注意:
如果id是主键,在第一次插入时用id='1'
,每次尝试插入id='1'
时将会更新姓名和年龄,并更改之前的姓名和年龄。
试一试这个:
INSERT INTO table (id, name, age) VALUES (1, 'A', 19) ON DUPLICATE KEY UPDATE id = id + 1;
希望这可以帮到你。
如果您想将非主要
字段作为触发ON DUPLICATE
的条件,您可以在该表上创建一个UNIQUE INDEX
键来触发DUPLICATE
。
ALTER TABLE `table` ADD UNIQUE `unique_index`(`name`);
如果您想将两个字段组合成唯一的表格,可以在最后一个参数中添加更多内容来实现此目的。
ALTER TABLE `table` ADD UNIQUE `unique_index`(`name`, `age`);
请注意,在删除其他行中相同的 name
和 age
值之前,确保先删除所有具有相同值的数据。
DELETE table FROM table AS a, table AS b WHERE a.id < b.id
AND a.name <=> b.name AND a.age <=> b.age;
此后,它应该触发ON DUPLICATE
事件。
INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE
name = VALUES(name), age = VALUES(age)
我正在寻找一个解决方案,用于从另一个结构相同的表格(在我的情况下是网站测试数据库到生产数据库)进行更新:
INSERT live-db.table1
SELECT *
FROM test-db.table1 t
ON DUPLICATE KEY UPDATE
ColToUpdate1 = t.ColToUpdate1,
ColToUpdate2 = t.ColToUpdate2,
...
ON DUPLICATE KEY UPDATE
之后只需要包含您想要更新的列。INSERT
或SELECT
中列出这些列,尽管我认为这可能是更好的做法。使用SQLite时:
REPLACE into table (id, name, age) values(1, "A", 19)
前提是id
是主键,否则它只会插入另一行。请参见 INSERT (SQLite)。
replace into
的作用是“插入或更新已存在的数据”。@Owl - DawnSongCREATE TRIGGER worklog_update AFTER INSERT ON worklog FOR EACH ROW REPLACE INTO support_time_monthly_hours ( ProjectID, monthTotalTime, Year, Month ) SELECT jiraissue.PROJECT, SUM(worklog.timeworked), YEAR(CURRENT_DATE()), MONTH(CURRENT_DATE()) FROM worklog, jiraissue WHERE worklog.issueid = jiraissue.ID AND jiraissue.PROJECT = (SELECT PROJECT FROM jiraissue WHERE NEW.issueid = jiraissue.ID ) AND worklog.startdate BETWEEN DATE_FORMAT(NOW() ,'%Y-%m-01 00:00:00') AND NOW();
- therobyouknow如果你想保留旧的字段(例如:姓名)。查询将会是:
INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE
name=name, age=19;