替换数据
可以使用 REPLACE INTO 语句来插入或者更新数据,本文介绍了相关语句的使用方法和示例。
数据替换准备
在替换表数据前,请确认以下事项:
-
请确认您已连接到 seekdb,连接数据库的操作请参见 连接方式概述。
-
请确认您已拥有待操作的表的
INSERT、UPDATE和DELETE权限。查看当前用户权限的相关操作请参见 查看用户权限。如果不具备该权限,请联系管理员为您授权,用户授权的相关操作请参见 直接授予权限。
替换数据
通常使用 REPLACE INTO 语句替换表中的一条或多条记录。
REPLACE INTO 语句语法格式如下:
REPLACE INTO table_name VALUES(list_of_values);
| 参数 | 是否必填 | 描述 | 示例 |
|---|---|---|---|
| table_name | 是 | 指定需要插入数据的表 | table1 |
| (list_of_values) | 是 | 插入的数据 | (1,'CN',2001, current_timestamp ()) |
REPLACE INTO 语句会根据替换数据与表的主键或唯一键进行判断:
-
如果没有主键或唯一键冲突,则插入记录。
-
如果存在主键或唯一键冲突,则先删除已有记录,再插入新行记录。
信息目标表建议有主键或者唯一索引,否则容易插入重复的记录。
表中无数据记录或者有数据记录但无主键、无唯一键冲突
当表中无数据记录,或者表中有数据记录但无主键或唯一键冲突时,可以使用 REPLACE INTO 语句替换数据,结果等价于通过 INSERT 语句插入数据。
示例:
-
创建
t_replace表后,使用REPLACE INTO语句插入一行数据。CREATE TABLE t_replace(
id number NOT NULL PRIMARY KEY
, name varchar(10) NOT NULL
, value number
,gmt_create timestamp NOT NULL DEFAULT current_timestamp
);
Query OK, 0 rows affected
REPLACE INTO t_replace values(1,'CN',2001, current_timestamp ());
Query OK, 1 row affected
SELECT * FROM t_replace;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | 2001 | 2025-12-23 15:04:08 |
+----+------+-------+---------------------+
1 row in set从示例结果可以看出,
t_replace表创建后未插入数据,执行REPLACE INTO语句后,表中插入了一条记录。 -
再次使用
REPLACE INTO语句,插入一行数据。SELECT * FROM t_replace;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | 2001 | 2025-12-23 15:04:08 |
+----+------+-------+---------------------+
1 row in set
REPLACE INTO t_replace(id, name, value, gmt_create) VALUES(2,'US',2002,current_timestamp ());
Query OK, 1 row affected
SELECT * FROM t_replace;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | 2001 | 2025-12-23 15:04:08 |
| 2 | US | 2002 | 2025-12-23 15:06:29 |
+----+------+-------+---------------------+
2 rows in set从示例结果可以看出,
t_replace表中已有一条记录,由于(2,'US',2002,current_timestamp ())数据与表内的记录不违反唯一性约束,故执行结果是在t_replace表中插入一条记录。 -
使用查询语句充当
REPLACE INTO语句的VALUES子句来插入多条数据。将表t_insert中的数据插入到表t_replace中。SELECT * FROM t_replace;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | 2001 | 2025-12-23 15:04:08 |
| 2 | US | 2002 | 2025-12-23 15:06:29 |
+----+------+-------+---------------------+
2 rows in set
SELECT * FROM t_insert;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 7 | EN | 1007 | 2025-12-23 15:13:57 |
| 8 | JP | 1008 | 2025-12-23 15:14:14 |
+----+------+-------+---------------------+
2 rows in set
REPLACE INTO t_replace
SELECT id,name,value,gmt_create FROM t_insert;
Query OK, 2 rows affected
Records: 2 Duplicates: 0 Warnings: 0
SELECT * FROM t_replace;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | 2001 | 2025-12-23 15:04:08 |
| 2 | US | 2002 | 2025-12-23 15:06:29 |
| 7 | EN | 1007 | 2025-12-23 15:13:57 |
| 8 | JP | 1008 | 2025-12-23 15:14:14 |
+----+------+-------+---------------------+
4 rows in set
表中有数据记录且存在主键或唯一键冲突
当表中有数据记录且插入的数据存在主键或唯一键冲突时,使用 REPLACE INTO 语句可以将表中已有的存在冲突的数据删除,替换为新的数据。
在 t_replace 表中插入一条记录,示例如下:
SELECT * FROM t_replace;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | 2001 | 2025-12-23 15:04:08 |
| 2 | US | 2002 | 2025-12-23 15:06:29 |
| 7 | EN | 1007 | 2025-12-23 15:13:57 |
| 8 | JP | 1008 | 2025-12-23 15:14:14 |
+----+------+-------+---------------------+
4 rows in set
REPLACE INTO t_replace(id, name, value, gmt_create) VALUES(2,'EN',2002,current_timestamp ());
Query OK, 2 rows affected
SELECT * FROM t_replace;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | 2001 | 2025-12-23 15:04:08 |
| 2 | EN | 2002 | 2025-12-23 15:15:01 |
| 7 | EN | 1007 | 2025-12-23 15:13:57 |
| 8 | JP | 1008 | 2025-12-23 15:14:14 |
+----+------+-------+---------------------+
4 rows in set
在示例中,由于表 t_replace 的 id 列为主键列,需要满足唯一性约束,而插入的数据 (2,'EN',2002,current_timestamp ()) 违反唯一性约束,系统删除了原来的行记录 (2,'US',2002,current_timestamp ()),插入 (2,'EN',2002,current_timestamp ()) 作为新的行记录。