一、
将所有to_date为9999-01-01的全部更新为NULL,且 from_date更新为2001-01-01。
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');
答案如下:
update titles_test set to_date=NUll,from_date='2001-01-01' where to_date='9999-01-01'
二、
题目描述
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、update 解法
update titles_test set emp_no='10005' where id='5'
2、replace
2.1
对比图1和图2 , 可以发现: 在图1中, id为2 的记录是表中的第一条记录, 当执行完上述的replace语句之后, id为2的记录位于整张表的最后。 这就说明, 这条replace语句删除了原有的id为2的记录, 有插入了一条新的id为2的记录。
答案如下:
replace into titles_test values
('5', '10005', 'Senior Engineer', '1986-06-26', '9999-01-01')
2.2
对比图2和图3 , 可以看到, id为2, name为lisi的记录的class字段没有值。
2.3 replace根据主键确定被替换的是哪一条记录
在该表中, 把id和name指定为复合主键。 在上面两条语句执行的时候, 都在values中指定了id为2, name为lisi 。 执行之后看到的结果也是id为2, name为lisi的记录被替换。
这就说明了replace语句根据主键的值确定被替换的是哪一条记录。
可以看到, 在表中插入了一条新的记录。
6 如果新插入的或替换的记录中, 有字段和表中的其他记录冲突, 那么会删除那条其他记录
上面的第5步同时也说明了这个问题。 对比图4 和图5 , 发现在插入一条新的id为100, name为a的记录之后, 还删除了id为2, name为lisi的记录。
为什么会这样呢? 我们在开始的时候说过, 表中的email字段加上了唯一约束。 id为2的记录的email和新插入的id为100的记录中的email相同,
都是[email protected] 。 这就导致违反唯一约束, 所以在插入id为100的记录之前, 删除了id为2的记录。
对比图4 和 图5 , 发现id为5的记录被替换掉, 并且把这条记录的email设置为[email protected], 这和图4中原有的id为6的记录冲突,
所以导致id为6的记录被删除, 在图5 中已经没有id为6的那条记录了。
replace语句和update语句的对比
对于update语句, 因为经常使用到,应该算比较熟悉。 下面对比一下update和replace语句的行为, 只是简单陈述, 不再以具体实例说明。
update语句使用where子句定位被更新的记录;
update语句可以一次更新一条记录, 也可以更新多条记录, 只要这多条记录都复合where子句的要求;
update只会在原记录上更新字段的值, 不会删除原有记录, 然后再插入新纪录;
如果在update语句中没有指定一些字段, 那么这些字段维持原有的值, 而不会被置空;
3、update 和replace 组合
UPDATE titles_test SET emp_no = REPLACE(emp_no,10001,10005) WHERE id = 5
三、
题目描述
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');
alter table titles_test rename to titles_2017
四、
题目描述
CREATE TABLE employees_test(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
CREATE TABLE audit(
EMP_no INT NOT NULL,
create_date datetime NOT NULL
);