题目描述

题目已经执行了如下语句:

  1. drop table if exists actor;
  2. CREATE TABLE actor (
  3. actor_id smallint(5) NOT NULL PRIMARY KEY,
  4. first_name varchar(45) NOT NULL,
  5. last_name varchar(45) NOT NULL,
  6. last_update DATETIME NOT NULL);
  7. insert into actor values ('3', 'WD', 'GUINESS', '2006-02-15 12:34:33');

对于表 actor 插入如下数据,如果数据已经存在,请忽略(不支持使用 replace 语句)

答案解析

本题主要考察的是 SQL 中的 insertinsert ignore 以及 replace 的区别。

我们先来看一下三个语句的区别:

指令 记录已存在
insert 报错
insert ignore 忽略
replace 替换

示例:

创建表:

  1. CREATE TABLE student(
  2. id INT(10) PRIMARY KEY AUTO_INCREMENT,
  3. name VARCHAR(255) UNIQUE,
  4. age INT(10)
  5. );

插入记录:

  1. INSERT INTO student(name, age)
  2. VALUES
  3. ('小明',24),
  4. ('小张',25),
  5. ('小红',23),
  6. ('小强',24);

查询所有记录,查询全表结果如下:

  1. +----+--------+------+
  2. | id | name | age |
  3. +----+--------+------+
  4. | 1 | 小明 | 24 |
  5. | 2 | 小张 | 25 |
  6. | 3 | 小红 | 23 |
  7. | 4 | 小强 | 24 |
  8. +----+--------+------+

INSERT

如果使用 insert 插入已存在的数据,插入不会成功,报错,但是主键 id 自增。

INSERT IGNORE

如果使用 insert ignore 插入已存在的数据,则会忽略新插入的记录,主键 id 会自增,语句执行不报错。
执行语句:

  1. INSERT IGNORE INTO student(name, age) VALUES ('小明', 24);

语句执行成功,查询全表结果如下:

  1. +----+--------+------+
  2. | id | name | age |
  3. +----+--------+------+
  4. | 1 | 小明 | 24 |
  5. | 2 | 小张 | 25 |
  6. | 3 | 小红 | 23 |
  7. | 4 | 小强 | 24 |
  8. +----+--------+------+

此时,下一个 id6。
_

REPLACE

如果使用 replace 语句,如果插入的是已存在的记录,则会删除原来的记录,添加新的记录;如果插入的是未存在的记录,则会执行正常的 insert 操作。
执行语句:

  1. REPLACE INTO student(name,age) VALUES ('小明',25);

语句执行成功,查询全表结果如下:

  1. +----+--------+------+
  2. | id | name | age |
  3. +----+--------+------+
  4. | 2 | 小张 | 25 |
  5. | 3 | 小红 | 23 |
  6. | 4 | 小强 | 24 |
  7. | 5 | 小明 | 25 |
  8. +----+--------+------+

回到本题,本题要求如果数据已经存在,则忽略;所以我们应该使用 insert ignore 语句,SQL 如下:

  1. INSERT IGNORE INTO `actor` (`actor_id`,`first_name`,`last_name`,`last_update`)
  2. VALUES (3,'ED','CHASE','2006-02-15 12:34:33');