Skip to main content

SQLite REPLACE:插入或替换现有行

SQLite替换语句简介

REPLACE语句的思想是,当发生唯一或主键约束冲突时,它会执行以下操作:

在第二步中,如果发生任何约束冲突,例如NOTNULL约束,REPLACE语句将中止操作并回滚事务。

下面说明了REPLACE语句的语法。

INSERT OR REPLACE INTO table(column_list)
VALUES(value_list);

或者简而言之:

REPLACE INTO table(column_list)
VALUES(value_list);

让我们来看一些使用SQLite REPLACE语句的例子,以了解它是如何工作的。

SQLite REPLACE语句示例

首先,使用以下结构创建一个名为positions的新表。

CREATE TABLE IF NOT EXISTS positions (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
min_salary NUMERIC
);

试试看

其次,在positions表中插入一些行。

INSERT INTO positions (title, min_salary)
VALUES ('DBA', 120000),
('Developer', 100000),
('Architect', 150000);

试试看

第三,使用下面的SELECT语句验证insert。

SELECT * FROM positions;

试试看

SQLite REPLACE positions table

下面的语句在positions表的title列上创建一个唯一的索引,以确保它没有任何重复的position title:

CREATE UNIQUE INDEX idx_positions_title 
ON positions (title);

试试看

假设您想在positions表中添加一个不存在的职位,如果该职位存在,则更新当前职位。

以下REPLACE语句在positions表中插入新行,因为position title Full Stack Developer不在positions表中。

REPLACE INTO positions (title, min_salary)
VALUES('Full Stack Developer', 140000);

试试看

SQLite REPLACE insert new row

可以使用SELECT语句验证替换操作。

SELECT
id,title,min_salary
FROM
positions;

试试看

见以下陈述。

REPLACE INTO positions (title, min_salary)
VALUES('DBA', 170000);

试试看

SQLite REPLACE - replace the existing row

首先,SQLite检查了唯一约束。

其次,由于该语句试图添加已经存在的DBA标题,因此违反了唯一约束,SQLite删除了现有的行。

第三,SQLite使用REPLACE语句提供的数据插入新行。

请注意,REPLACE语句的意思是插入或替换,而不是插入或更新。

见以下陈述。

REPLACE INTO positions (id, min_salary)
VALUES(2, 110000);

试试看

声明试图做的是更新id为2的职位的min_工资,该职位是开发者。

首先,id为2的位置已经存在,REPLACE语句将其删除。

然后,SQLite尝试插入一个包含两列的新行:(id,min_salary)。但是,它违反了标题列的NOTNULL约束。因此,SQLite回滚事务。

如果标题列没有NOTNULL约束,REPLACE语句将插入标题列为NULL的新行。

在本教程中,我们向您展示了如何使用SQLite REPLACE语句插入或替换表中的行。