SQL语法——REPLACE语句

REPLACE

MySQL REPLACE语句是标准SQL的MySQL扩展。MySQL REPLACE语句的工作原理如下:

  1. 如果新行已不存在,则MySQL REPLACE 语句将插入新行。
  2. 如果新行已存在,则 REPLACE 语句首先删除旧行,然后插入新行。在某些情况下,REPLACE语句仅更新现有行。

注意:要确定表中是否已存在新行,MySQL使用PRIMARY KEY或UNIQUE KEY 索引。如果表没有这些索引之一,则REPLACE语句等同于INSERT语句。

示例

CREATE TABLE cities (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    population INT NOT NULL
); 

INSERT INTO cities(name,population)
VALUES('New York',8008278),
   ('Los Angeles',3694825),
   ('San Diego',1223405); 

在这里插入图片描述
使用REPLACE语句更新洛杉矶城市的人口3696820

REPLACE INTO cities(id, population)
VALUES(2,3696820);

在这里插入图片描述

REPLACE工作原理如下:

  1. REPLACE语句首先使用列表提供的信息将新行插入cities表中。插入失败,因为cities表中已存在id为2的行,因此,MySQL会引发重复键错误。
  2. 然后REPLACE语句将更新具有id列值中指定的键的行。在正常过程中,它将首先删除具有冲突ID的旧行,然后插入新行。

MySQL REPLACE和INSERT
REPLACE语句的第一种形式类似于INSERT语句,除了关键字INSERT被关键字替换REPLACE如下:

REPLACE INTO table_name(column_list)
VALUES(value_list); 

例如,如果要在cities表中插入新行

REPLACE INTO cities(name,population)
VALUES('Phoenix',1321523); 

在这里插入图片描述

注意:未出现在REPLACE语句中的列的默认值将插入到相应的列中。如果列具有NOT NULL属性且没有默认值,并且您未在REPLACE语句中指定值,则MySQL将引发错误。这是REPLACE和INSERT语句之间的区别。

REPLACE INTO cities(name)
VALUES('Houston'); 

在这里插入图片描述

MySQL REPLACE和UPDATE
第二种形式的 REPLACE 陈述类似于以下UPDATE陈述:

REPLACE INTO table
SET column1 = value1,
    column2 = value2; 

例如,如果要更新Phoenix城市的人口1768980,请使用以下REPLACE语句:

REPLACE INTO cities
SET id = 4,
    name = 'Phoenix',
    population = 1768980; 

在这里插入图片描述

注意:与UPDATE语句不同,如果未在SET子句中指定列的值,则REPLACE语句将使用列的默认值

MySQL REPLACE INTO和SELECT
第三种形式的 REPLACE 语句类似于INSERT INTO SELECT语句:

REPLACE INTO table_1(column_list)
SELECT column_list
FROM table_2
WHERE where_condition;

假设要复制id值为1的城市,请将REPLACE INTO SELECT语句用作以下查询:

REPLACE INTO cities(name,population)
SELECT name,population FROM cities 
WHERE id = 1; 

在这里插入图片描述

注意

  1. 如果开发的应用程序不仅支持MySQL数据库,还支持其他关系数据库管理系统(RDBMS),则应避免使用REPLACE语句,因为其他RDBMS可能不支持它。相反,您可以在事务中使用DELETE 和 INSERT语句的组合 。
  2. 如果使用的是REPLACE在具有TABLE语句触发器和重复键错误发生的删除,触发器将按照以下顺序被解雇:BEFORE INSERT BEFORE DELETE,AFTER DELETE,AFTER INSERT 万一REPLACE语句删除当前行并插入新行。如果REPLACE语句更新当前行,则会触发BEFORE UPDATE和AFTER UPDATE触发器。

sql

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值