数组数据的修改:array_append(),array_remove()
有时候数组不只是用来看,还得改:比如加个新值、删掉旧的、或者更新内容。好在 PostgreSQL 给咱们准备了专门的函数,能很方便地操作数组内容,不用手动重写整个数组,就是 array_append() 和 array_remove()。来看看它们咋用。
用 array_append() 给数组加元素
array_append() 这个函数就是用来往数组末尾加新元素的。它要俩参数:
- 你想改的原始数组。
- 你想加进数组的值。
例子 1:简单的数字数组
假设咱们有个表叫 projects,有一列 team_members,里面存着参与项目的用户 ID 数组。
CREATE TABLE projects (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
team_members INT[]
);
-- 插入几行数据
INSERT INTO projects (name, team_members)
VALUES
('项目A', ARRAY[1, 2, 3]),
('项目B', ARRAY[4, 5]);
现在有个“项目A”,咱们想给 team_members 这个数组加个新成员,ID 是 7。用 array_append():
UPDATE projects
SET team_members = array_append(team_members, 7)
WHERE name = '项目A';
-- 看下结果:
SELECT * FROM projects;
结果:
| id | name | team_members |
|---|---|---|
| 1 | 项目A | {1,2,3,7} |
| 2 | 项目B | {4,5} |
你看,ID 为 7 的成员已经加进数组啦!
例子 2:加文本元素
同样的 array_append() 也能用在别的类型的数组上。比如,咱们给商品的类别数组加个新类别。
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
categories TEXT[]
);
-- 插入带类别的商品
INSERT INTO products (name, categories)
VALUES
('智能手机', ARRAY['电子产品', '小玩意']),
('笔记本', ARRAY['电脑', '电子产品']);
-- 给“智能手机”加个新类别“热门”
UPDATE products
SET categories = array_append(categories, '热门')
WHERE name = '智能手机';
-- 看下结果:
SELECT * FROM products;
结果:
| id | name | categories |
|---|---|---|
| 1 | 智能手机 | {电子产品,小玩意,热门} |
| 2 | 笔记本 | {电脑,电子产品} |
用 array_remove() 从数组里删元素
如果说 array_append() 像是往待办清单里加任务,那 array_remove() 就是把已经做完的任务划掉。这个函数要俩参数:
- 原始数组。
- 你想删掉的值。
例子 1:从数字数组里删元素
咱们回到 projects 表。现在知道 ID 为 7 的成员不再参与“项目A”了,把他从 team_members 里删掉:
UPDATE projects
SET team_members = array_remove(team_members, 7)
WHERE name = '项目A';
-- 看下结果:
SELECT * FROM projects;
结果:
| id | name | team_members |
|---|---|---|
| 1 | 项目A | {1,2,3} |
| 2 | 项目B | {4,5} |
array_remove() 成功把 ID 为 7 的成员删掉了。
例子 2:删文本元素
再看下 products 表。如果“热门”这个类别对智能手机不合适了,可以删掉它:
UPDATE products
SET categories = array_remove(categories, '热门')
WHERE name = '智能手机';
-- 看下结果:
SELECT * FROM products;
结果:
| id | name | categories |
|---|---|---|
| 1 | 智能手机 | {电子产品,小玩意} |
| 2 | 笔记本 | {电脑,电子产品} |
如果你想删的元素本来就不在数组里,array_remove() 会让数组 保持不变。这点很方便,因为不会报错啥的。
组合用 array_append() 和 array_remove()
有时候咱们得先确认元素不在数组里,再加进去。可以这样组合用:
例子:加唯一元素
比如,咱们想让 ID 为 7 的成员只在数组里出现一次。可以用 array_remove() 检查:
UPDATE projects
SET team_members = array_append(team_members, 7)
WHERE name = '项目A' AND NOT (team_members @> ARRAY[7]);
-- 看下结果:
SELECT * FROM projects;
解释:
@>这个操作符用来检查数组里有没有7。- 如果
team_members已经有7,就不会再加了。
常见错误和建议
1. 往数组里加 NULL。 如果你用 array_append() 加 NULL(比如 array_append(team_members, NULL)),那数组里就会多一个 NULL。不会报错,但结果可能不是你想要的。建议加之前先检查下是不是 NULL。
-- 检查例子:
UPDATE projects
SET team_members = array_append(team_members, COALESCE(NULL, -1))
WHERE name = '项目A';
2. 数组里混用不同类型的数据。 PostgreSQL 的数组只能存同一种类型的值。比如你不能往数字数组里加字符串:
-- 这样会报错:
UPDATE projects
SET team_members = array_append(team_members, 'example');
避免这种情况,记得类型要一致。如果不确定,可以用 :: 转一下类型:
-- 类型转换例子:
UPDATE projects
SET team_members = array_append(team_members, '5'::INT);
GO TO FULL VERSION