首页 > 试题广场 >

将id=5以及emp_no=10001的行数据替换成id=5

[编程题]将id=5以及emp_no=10001的行数据替换成id=5
  • 热度指数:100617 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
将id=5以及emp_no=10001的行数据替换成id=5以及emp_no=10005,其他数据保持不变,使用replace实现。
CREATE TABLE IF NOT EXISTS titles_test (
   id int(11) not null primary key,
   emp_no int(11) NOT NULL,
   title varchar(50) NOT NULL,
   from_date date NOT NULL,
   to_date date DEFAULT NULL);

insert into titles_test values 
('1', '10001', 'Senior Engineer', '1986-06-26', '9999-01-01'),
('2', '10002', 'Staff', '1996-08-03', '9999-01-01'),
('3', '10003', 'Senior Engineer', '1995-12-03', '9999-01-01'),
('4', '10004', 'Senior Engineer', '1995-12-03', '9999-01-01'),
('5', '10001', 'Senior Engineer', '1986-06-26', '9999-01-01'),
('6', '10002', 'Staff', '1996-08-03', '9999-01-01'),
('7', '10003', 'Senior Engineer', '1995-12-03', '9999-01-01');
示例1

输入

drop table if exists titles_test;
CREATE TABLE titles_test (
   id int(11) not null primary key,
   emp_no  int(11) NOT NULL,
   title  varchar(50) NOT NULL,
   from_date  date NOT NULL,
   to_date  date DEFAULT NULL);

insert into titles_test values
('1', '10001', 'Senior Engineer', '1986-06-26', '9999-01-01'),
('2', '10002', 'Staff', '1996-08-03', '9999-01-01'),
('3', '10003', 'Senior Engineer', '1995-12-03', '9999-01-01'),
('4', '10004', 'Senior Engineer', '1995-12-03', '9999-01-01'),
('5', '10001', 'Senior Engineer', '1986-06-26', '9999-01-01'),
('6', '10002', 'Staff', '1996-08-03', '9999-01-01'),
('7', '10003', 'Senior Engineer', '1995-12-03', '9999-01-01');

输出

5|10005|Senior Engineer|1986-06-26|9999-01-01
本题运用 REPLACE 有两种解法
方法一:全字段更新替换。由于 REPLACE 的新记录中 id=5,与表中的主键 id=5 冲突,故会替换掉表中 id=5 的记录,否则会插入一条新记录(例如新插入的记录 id = 10)。并且要将所有字段的值写出,否则将置为空。可参考:
REPLACE INTO titles_test VALUES (5, 10005, 'Senior Engineer', '1986-06-26', '9999-01-01')
方法二:运用REPLACE(X,Y,Z)函数。其中X是要处理的字符串,Y是X中将要被替换的字符串,Z是用来替换Y的字符串,最终返回替换后的字符串。以下语句用 UPDATE和REPLACE 配合完成,用REPLACE函数替换后的新值复制给 id=5 的 emp_no。REPLACE的参数为整型时也可通过。可参考:
UPDATE titles_test SET emp_no = REPLACE(emp_no,10001,10005) WHERE id = 5
/** 另外可以利用OJ系统的漏洞,不用 REPLACE 实现  **/
UPDATE titles_test SET emp_no = 10005 WHERE id = 5

编辑于 2017-07-22 16:55:40 回复(17)

replace 完美解决方案

上面写的replace答案将要替换的数据写死了.使用下面的写法不会写死数据.

replace into titles_test
select 5, 10005, title, from_date, to_date
from titles_test
where id = 5;
发表于 2018-05-02 15:44:44 回复(12)
我敲,第一次知道还有REPLACE INTO这种写法
发表于 2020-08-20 15:47:50 回复(7)
使用replace两种方法,如果直接使用REPLACE INTO的话,就需要重新插入一条完整的新纪录,sql会自动代替id相同的记录;也可以使用UPDATE结合,REPLACE(colname,oldval,newval)来赋值给colnamejik
REPLACE INTO titles_test VALUES(5,10005,...);
#另一种写法
#UPDATE titles_test SET emp_no = REPLACE(emp_no,10001,10005) WHERE id = 5;
#牛客漏洞:直接使用update也可以ac
UPDATE titles_test SET emp_no = 10005 WHERE id=5;
发表于 2017-09-01 01:20:39 回复(1)
  本题很容易写出一个bug,即,replace into titles_test (id,emp_no) values(5,10005);而忽略了其他字段,因为replace操作的过程是有冲突时先删除原有的有冲突的记录再插入新的记录,所以对于记录没有插入数据的字段的值是null,所以如果采用这条语句,那么title、from_date、to_date字段的值都是null,而题目要求其他字段的数据不变,所以正确的replaece语句是:replace into titles_test values(5,10005,'Senior Engineer', '1986-06-26', '9999-01-01');
   当然如果没有只用replace限制的话,可以用更新操作,因为更新操作的过程是INSERT失败后执行UPDATE,所以对于没有插入数据的其他字段的数据是不变的,即,insert into titles_test (id,emp_no)values(5,10005) on duplicate key update emp_no = 10005;
编辑于 2018-02-26 13:16:09 回复(2)
update titles_test set emp_no = replace(emp_no,10001,10005) where id=5
replace(字段,“需要替换的值”,“替换后的值”)
发表于 2017-08-31 00:01:04 回复(2)
mysql中有三种方法可以实现:
法一:
受影响的行: 1
时间: 0.101s
update titles_test set emp_no = 10005
where id = 5;

法二:
受影响的行: 2
时间: 0.075s
replace into titles_test values
(5, 10005, 'Senior Engineer', '1986-06-26', '9999-01-01');

法三:
受影响的行: 1
时间: 0.070s
update titles_test SET
emp_no = replace(emp_no, 10001, 10005)
where id = 5;
发表于 2020-05-15 23:04:32 回复(3)
各位大佬, 请问一下问什么这题在update statement里的set直接赋值跟用replace赋值结果会不一样呢?
即下面两个代码结果不同:
update titles_test
set emp_no = 10005
where id = 5 and emp_no = 10001;

update titles_test
set emp_no=replace(emp_no,10001,10005)
where id=5 and emp_no = 10001
第二个是正确的, 参考自@华科平凡
发表于 2020-12-13 04:41:30 回复(1)

update titles_test 
set emp_no=replace(emp_no,10001,10005) 
where id=5
发表于 2017-11-08 20:19:13 回复(0)
-- 方法一:利用id冲突后会将该段记录覆盖之前的
REPLACE INTO titles_test VALUES (5, 10005, 'Senior Engineer', '1986-06-26', '9999-01-01')

 -- 方法二:精确打击
UPDATE titles_test SET emp_no = REPLACE(emp_no,10001,10005) WHERE id = 5

发表于 2021-07-21 09:03:05 回复(0)
insert or replace into titles_test values(5,10005,'Senior Engineer', '1986-06-26', '9999-01-01')

发表于 2019-12-02 15:48:11 回复(0)
replace into titles_test values (5,10005,'Senior Engineer', '1986-06-26', '9999-01-01')
【解题思路】replace语句的运用。
replace into table values( , , , )
如果表中有的列未在values中提及,则会对该列置空,因此为满足题意,需要把全部列都写上。
replace不可以用where条件定位。

用update更简单:
update titles_test

set emp_no=10005

where id=5

发表于 2019-06-12 12:12:58 回复(0)

首先,OJ系统上,直接使用update语句也可通过。

update titles_test 
set id = 5,
    emp_no = 10005
where id = 5 and emp_no = 10001

replace的使用方法:
replace into table_name values(...)
注意:replace不能使用where语句,它是通过表主键来确定替换哪一条记录。

replace into titles_test (id, emp_no, title, from_date, to_date
)values( 5, '10005', 'Senior Engineer', '1986-06-26', '9999-01-01')

参考:https://blog.csdn.net/zhangjg_blog/article/details/23267761

编辑于 2018-09-06 18:04:33 回复(0)
考点:replace 函数的基本使用
想法:我觉得在这里面emp_no是没有什么必要的,和直接设置效果是一样的,因为id是唯一的。我想这个应该是在id重复的情况下,emp_no不同的时候,将emp_no为10001的替换为10005,而不是10001的就不进行更新。
update titles_test
set emp_no = replace(emp_no, 10001, 10005)
where id = 5


发表于 2021-03-27 15:01:07 回复(0)
使用replace替换记录的语句为 replace(字段,旧内容,新内容)
结合update使用:
update titles_test
set emp_no=replace(emp_no,10001,10005)
where id=5;
发表于 2021-01-25 13:26:22 回复(0)
所以这题到底考察replace()函数还是REPLACE INTO 语句?
前者用在这题很鸡肋,所以应该是后者吧
发表于 2019-04-04 15:37:34 回复(0)
update titles_test set id=5,emp_no=10005 where id=5 and emp_no=10001;
发表于 2017-09-14 04:18:09 回复(3)
update titles_test
set emp_no = replace(emp_no,'10001','10005')
where id = 5
update 表名 set 字段名=replacce(字段名,替换前的值,替换后的值)
    where 修改条件
发表于 2024-10-31 14:15:36 回复(0)
UPDATE titles_test 
SET EMP_NO = REPLACE(EMP_NO,'10001', '10005')
WHERE ID = '5'
AND EMP_NO = '10001'
;
发表于 2022-04-16 17:02:59 回复(0)
update titles_test set id=5,emp_no=10005
where id=5 and emp_no=10001
这样错在哪儿呢?
发表于 2021-09-12 14:28:47 回复(2)