我们在使用 MySQL 数据库时可能会遇到这种情况。如下Students_hobby_t 表,Id字段为唯一索引,当我们使用 INSERT 向 Students_hobby_t 表中写入一条记录,且该条记录的 Id值已存在于表中,则将会抛出主键冲突的错误。 当然,有时候我们需要使用新记录的值来覆盖原来的记录值。如果使用传统的做法,则需要必须先使用DELETE 语句删除原先的记录,然后再使用 INSERT 写入新的记录。 REPLACE INTO除此之外,在MySQL中提供了一种新的解决方案,那就是 REPLACE INTO 语句。使用REPLACE写入一条记录时, 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。否则,直接插入新数据,避免了在同时使用DELETE和INSERT时添加事务等复杂操作了。 在使用REPLACE时,表中必须存在主键索引或唯一索引,而且这个索引所在的字段不能允许空值,否则REPLACE将和INSERT完全一样的。 如下,使用REPLACE语句是写入或更新一条记录。 使用REPLACE写入或更新多条记录: REPLACE也可以使用 SET 语句写入或更新记录: 另外,还支持 REPLACE SELECT 用法,即使用REPLACE SELECT从Students_hobby_o 表中将所有数据导入Students_hobby_t 中。这种用法并不要求列名匹配,只关心字段的位置。 如上即为REPLACE INTO语法的三种形式:
除此之外,我们还需要知道。使用 REPLACE写入一条记录后,数据库将返回所影响的行数:
这里需要注意的是,如果当表中存在多个唯一索引时,使用REPLACE需要注意以下情况,假设有Students_hobby_t 表的Id、Phone都是唯一索引,如下: 此时,我们使用REPLACE 语句向Students_hobby_t 中写入一条记录。 返回结果如下: 此时Students_hobby_t 表数据如下: 我们可以看到,REPLACE将原先的2 条记录都删除了,然后将新的记录写入。 UPDATE和REPLACE的区别
最后,不建议使用REPLACE INTO更新部分字段,可能会导致其它有值字段变为NULL。 |
|