插入到MySQL表中,如果存在则更新

我想向数据库表添加一行,但如果存在具有相同唯一键的行,我想更新该行。

例如:

INSERT INTO table_name (ID, NAME, AGE) VALUES(1, "A", 19);
假设唯一键是ID,在我的数据库中,有一行是ID = 1。在这种情况下,我想用这些值更新该行。通常这会给出一个错误。< br / >如果我使用INSERT IGNORE,它将忽略错误,但它仍然不会更新
1159410 次浏览

使用# 1

查询:

INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATEname="A", age=19

检查替换

http://dev.mysql.com/doc/refman/5.0/en/replace.html

REPLACE into table (id, name, age) values(1, "A", 19)

试试这个吧:

INSERT INTO table (id, name, age) VALUES (1, 'A', 19) ON DUPLICATE KEY UPDATE id = id + 1;

希望这能有所帮助。

试试这个:

# 0

< p >注意:< br >这里如果id是主键,那么在第一次插入id='1'之后,每次尝试插入id='1'都会更新名称和年龄,之前的名称年龄将会改变

使用SQLite时:

REPLACE into table (id, name, age) values(1, "A", 19)

假设id是主键。或者它只是插入另一行。参见INSERT (SQLite)。

当使用批量插入时,请使用以下语法:

INSERT INTO TABLE (id, name, age) VALUES (1, "A", 19), (2, "B", 17), (3, "C", 22)ON DUPLICATE KEY UPDATEname = VALUES (name),...

只是因为我在这里寻找这个解决方案,但从另一个相同结构的表更新(在我的情况下,网站测试DB到live DB):

INSERT  live-db.table1SELECT  *FROM    test-db.table1 tON DUPLICATE KEY UPDATEColToUpdate1 = t.ColToUpdate1,ColToUpdate2 = t.ColToUpdate2,...

正如在其他地方提到的,只有您想要更新的列需要包含在ON DUPLICATE KEY UPDATE之后。

不需要列出INSERTSELECT中的列,尽管我同意这可能是更好的实践。

以下任何一种方法都可以解决你的问题:

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

在我的情况下,我创建了下面的查询,但在第一个查询中,如果id 1已经存在,年龄已经存在,在那之后,如果你创建的第一个查询没有age,那么age的值将为none

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

希望它能帮助你……

以防万一,你想保留旧字段(例如:name)。查询将是:

INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATEname=name, age=19;

如果您希望将non-primary字段作为ON DUPLICATE的标准/条件,则可以在该表上创建UNIQUE INDEX键来触发DUPLICATE

ALTER TABLE `table` ADD UNIQUE `unique_index`(`name`);

如果您想组合两个字段以使其在表上惟一,可以通过在最后一个参数上添加更多参数来实现这一点。

ALTER TABLE `table` ADD UNIQUE `unique_index`(`name`, `age`);

注意,只需确保首先删除其他行中具有相同nameage值的所有数据。

DELETE table FROM table AS a, table AS b WHERE a.id < b.idAND a.name <=> b.name AND a.age <=> b.age;

之后,它应该触发ON DUPLICATE事件。

INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATEname = VALUES(name), age = VALUES(age)

以下是一些可行的方法:

使用# 0

# 0语句允许您向表中插入一行或多行

  • 首先,指定表名,并在INSERT INTO子句后的括号内指定以逗号分隔的列列表。
  • 其次,在VALUES关键字后面的圆括号内放置一个以逗号分隔的对应列的值列表。
INSERT INTO table_name(column_name1, column_name2, column_name3) VALUES("col_value_1", "col_value_2", "col_value_3");

使用INSERT INTOWHERE NOT EXISTS子句

INSERT INTO table_name (column_name_1, column_name_2, column_name_3)SELECT * FROM (SELECT "col_value_1", "col_value_2","col_value_3") AS tmp_nameWHERE NOT EXISTS (SELECT column_name2 FROM table_name WHERE column_name = "sample_name") LIMIT 1;

使用# 0

# 0的工作原理与# 1完全相同,不同之处在于,如果表中的旧行与PRIMARY KEY或UNIQUE索引的新行具有相同的值,则在插入新行之前删除旧行。

REPLACE INTO table_name(column_name1, column_name2, column_name3) VALUES("col_value_1", "col_value_2", "col_value_3");