题目描述
题目已经执行了如下语句:
drop table if exists actor;
CREATE TABLE actor (
actor_id smallint(5) NOT NULL PRIMARY KEY,
first_name varchar(45) NOT NULL,
last_name varchar(45) NOT NULL,
last_update DATETIME NOT NULL);
insert into actor values ('3', 'WD', 'GUINESS', '2006-02-15 12:34:33');
对于表 actor 插入如下数据,如果数据已经存在,请忽略(不支持使用 replace 语句)
答案解析
本题主要考察的是 SQL 中的 insert,insert ignore 以及 replace 的区别。
我们先来看一下三个语句的区别:
指令 | 记录已存在 |
---|---|
insert | 报错 |
insert ignore | 忽略 |
replace | 替换 |
示例:
创建表:
CREATE TABLE student(
id INT(10) PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) UNIQUE,
age INT(10)
);
插入记录:
INSERT INTO student(name, age)
VALUES
('小明',24),
('小张',25),
('小红',23),
('小强',24);
查询所有记录,查询全表结果如下:
+----+--------+------+
| id | name | age |
+----+--------+------+
| 1 | 小明 | 24 |
| 2 | 小张 | 25 |
| 3 | 小红 | 23 |
| 4 | 小强 | 24 |
+----+--------+------+
INSERT
如果使用 insert 插入已存在的数据,插入不会成功,报错,但是主键 id 自增。
INSERT IGNORE
如果使用 insert ignore 插入已存在的数据,则会忽略新插入的记录,主键 id 会自增,语句执行不报错。
执行语句:
INSERT IGNORE INTO student(name, age) VALUES ('小明', 24);
语句执行成功,查询全表结果如下:
+----+--------+------+
| id | name | age |
+----+--------+------+
| 1 | 小明 | 24 |
| 2 | 小张 | 25 |
| 3 | 小红 | 23 |
| 4 | 小强 | 24 |
+----+--------+------+
REPLACE
如果使用 replace 语句,如果插入的是已存在的记录,则会删除原来的记录,添加新的记录;如果插入的是未存在的记录,则会执行正常的 insert 操作。
执行语句:
REPLACE INTO student(name,age) VALUES ('小明',25);
语句执行成功,查询全表结果如下:
+----+--------+------+
| id | name | age |
+----+--------+------+
| 2 | 小张 | 25 |
| 3 | 小红 | 23 |
| 4 | 小强 | 24 |
| 5 | 小明 | 25 |
+----+--------+------+
回到本题,本题要求如果数据已经存在,则忽略;所以我们应该使用 insert ignore 语句,SQL 如下:
INSERT IGNORE INTO `actor` (`actor_id`,`first_name`,`last_name`,`last_update`)
VALUES (3,'ED','CHASE','2006-02-15 12:34:33');