我想向数据库表中添加一行,但如果存在具有相同唯一键的行,我想更新该行。例如:
INSERT INTO table_name (ID, NAME, AGE) VALUES(1, "A", 19);
假设唯一键是 ID ,在我的数据库中,有一行 ID = 1 . 在这种情况下,我想用这些值更新该行。通常这会产生一个错误。如果我使用 INSERT IGNORE 它将忽略错误,但仍不会更新。
ID
ID = 1
INSERT IGNORE
fzwojiic1#
使用 INSERT ... ON DUPLICATE KEY UPDATE 查询:
INSERT ... ON DUPLICATE KEY UPDATE
INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE name="A", age=19
1cklez4t2#
checkout 替换http://dev.mysql.com/doc/refman/5.0/en/replace.html
REPLACE into table (id, name, age) values(1, "A", 19)
wfauudbj3#
使用批插入时,请使用以下语法:
INSERT INTO TABLE (id, name, age) VALUES (1, "A", 19), (2, "B", 17), (3, "C", 22) ON DUPLICATE KEY UPDATE name = VALUES (name), ...
bxpogfeg4#
这些解决方案中的任何一个都适用于您的问题:
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);
如果您想了解有关这些声明的详细信息,请访问此链接
vatpfxk55#
试试这个:
INSERT INTO table (id, name, age) VALUES (1, 'A', 19) ON DUPLICATE KEY UPDATE id = id + 1;
希望这有帮助。
r55awzrz6#
试试这个: 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','Mohammad','21') ON DUPLICATE KEY UPDATE name='Mohammad',age='21'
id='1'
yqyhoc1h7#
使用sqlite时:
前提是 id 是主键。或者它只是插入另一行。请参见插入(sqlite)。
id
jckbn6z78#
就因为我在这里寻找这个解决方案,但要从另一个相同结构的表(在我的例子中是从test db到live db)进行更新:
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 ,虽然我同意这可能是更好的做法。
ON DUPLICATE KEY UPDATE
INSERT
SELECT
2guxujil9#
万一你想 non-primary 作为标准/条件的字段 ON DUPLICATE ,你可以做一个 UNIQUE INDEX 键触发 DUPLICATE .
non-primary
ON DUPLICATE
UNIQUE INDEX
DUPLICATE
ALTER TABLE `table` ADD UNIQUE `unique_index`(`name`);
如果您希望合并两个字段以使其在表中唯一,可以通过在最后一个参数上添加更多字段来实现这一点。
ALTER TABLE `table` ADD UNIQUE `unique_index`(`name`, `age`);
注意,请确保首先删除所有具有相同属性的数据 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)
nlejzf6q10#
在我的例子中,我创建了以下查询,但在第一个查询中,如果 id 如果创建第一个查询时没有 age 比…的价值 age 不会有
REPLACE into table SET `id` = 1, `name` = 'A', `age` = 19
为了避免上述问题,创建如下查询
INSERT INTO table SET `id` = '1', `name` = 'A', `age` = 19 ON DUPLICATE KEY UPDATE `id` = "1", `name` = "A",`age` = 19
愿它能帮助你。。。
jckbn6z711#
在这种情况下,您希望保留旧字段(例如:name)。查询将是:
INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE name=name, age=19;
11条答案
按热度按时间fzwojiic1#
使用
INSERT ... ON DUPLICATE KEY UPDATE
查询:1cklez4t2#
checkout 替换
http://dev.mysql.com/doc/refman/5.0/en/replace.html
wfauudbj3#
使用批插入时,请使用以下语法:
bxpogfeg4#
这些解决方案中的任何一个都适用于您的问题:
或
或
如果您想了解有关这些声明的详细信息,请访问此链接
vatpfxk55#
试试这个:
希望这有帮助。
r55awzrz6#
试试这个:
INSERT INTO table (id,name,age) VALUES('1','Mohammad','21') ON DUPLICATE KEY UPDATE name='Mohammad',age='21'
注:这里如果id是主键,那么在第一次插入之后
id='1'
每次尝试插入id='1'
将更新姓名和年龄,以前的姓名年龄将更改。yqyhoc1h7#
使用sqlite时:
前提是
id
是主键。或者它只是插入另一行。请参见插入(sqlite)。jckbn6z78#
就因为我在这里寻找这个解决方案,但要从另一个相同结构的表(在我的例子中是从test db到live db)进行更新:
如前所述,只有要更新的列才需要包含在后面
ON DUPLICATE KEY UPDATE
.不需要列出
INSERT
或者SELECT
,虽然我同意这可能是更好的做法。2guxujil9#
万一你想
non-primary
作为标准/条件的字段ON DUPLICATE
,你可以做一个UNIQUE INDEX
键触发DUPLICATE
.如果您希望合并两个字段以使其在表中唯一,可以通过在最后一个参数上添加更多字段来实现这一点。
注意,请确保首先删除所有具有相同属性的数据
name
以及age
其他行中的值。在那之后,它应该会触发
ON DUPLICATE
事件。nlejzf6q10#
在我的例子中,我创建了以下查询,但在第一个查询中,如果
id
如果创建第一个查询时没有age
比…的价值age
不会有为了避免上述问题,创建如下查询
愿它能帮助你。。。
jckbn6z711#
在这种情况下,您希望保留旧字段(例如:name)。查询将是: