CodeGym /Các khóa học /SQL SELF /Thay đổi dữ liệu trong mảng: array_append()...

Thay đổi dữ liệu trong mảng: array_append(), array_remove()

SQL SELF
Mức độ , Bài học
Có sẵn

Đôi khi mảng không chỉ để đọc mà còn cần sửa: thêm giá trị mới, xóa cái cũ, cập nhật nội dung. May là trong PostgreSQL có mấy hàm chuyên dụng giúp quản lý mảng dễ dàng, không phải tự sửa tay từng phần tử, như array_append()array_remove(). Xem thử chúng hoạt động thế nào nhé.

Thêm phần tử vào mảng với array_append()

Hàm array_append() dùng để thêm phần tử mới vào cuối mảng. Nó nhận hai tham số:

  1. Mảng gốc mà bạn muốn sửa.
  2. Giá trị bạn muốn thêm vào mảng.

Ví dụ 1: Mảng số đơn giản

Giả sử có bảng projects với cột team_members, nơi lưu mảng id người dùng đang làm dự án.

CREATE TABLE projects (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    team_members INT[]
);

-- Thêm vài dòng
INSERT INTO projects (name, team_members)
VALUES
('Du an A', ARRAY[1, 2, 3]),
('Du an B', ARRAY[4, 5]);

Bây giờ có dự án "Du an A", và mình muốn thêm thành viên mới có id 7 vào mảng team_members. Dùng array_append() nhé:

UPDATE projects
SET team_members = array_append(team_members, 7)
WHERE name = 'Du an A';

-- Kiểm tra kết quả:
SELECT * FROM projects;

Kết quả:

id name team_members
1 Du an A {1,2,3,7}
2 Du an B {4,5}

Nhìn kìa, thành viên có ID 7 đã được thêm vào mảng rồi nhé!

Ví dụ 2: Thêm phần tử dạng text

array_append() cũng dùng được với mảng kiểu khác. Ví dụ, thêm category mới vào mảng category của sản phẩm.

CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    categories TEXT[]
);

-- Thêm sản phẩm với category
INSERT INTO products (name, categories)
VALUES
('Dien thoai', ARRAY['Dien tu', 'Gadget']),
('Laptop', ARRAY['May tinh', 'Dien tu']);

-- Thêm category mới "Pho bien" cho "Dien thoai"
UPDATE products
SET categories = array_append(categories, 'Pho bien')
WHERE name = 'Dien thoai';

-- Kiểm tra kết quả:
SELECT * FROM products;

Kết quả:

id name categories
1 Dien thoai {Dien tu,Gadget,Pho bien}
2 Laptop {May tinh,Dien tu}

Xóa phần tử khỏi mảng với array_remove()

Nếu array_append() giống như thêm task mới vào todo-list, thì array_remove() là công cụ để gạch bỏ task đã xong. Hàm này nhận:

  1. Mảng gốc.
  2. Giá trị bạn muốn xóa.

Ví dụ 1: Xóa phần tử khỏi mảng số

Quay lại bảng projects. Giả sử biết thành viên có ID 7 không còn làm ở "Du an A" nữa. Xóa khỏi mảng team_members nhé:

UPDATE projects
SET team_members = array_remove(team_members, 7)
WHERE name = 'Du an A';

-- Kiểm tra kết quả:
SELECT * FROM projects;

Kết quả:

id name team_members
1 Du an A {1,2,3}
2 Du an B {4,5}

Hàm array_remove() đã xóa thành viên có ID 7 thành công.

Ví dụ 2: Xóa phần tử dạng text

Giờ nhìn sang bảng products. Nếu category "Pho bien" không còn hợp với "Dien thoai", mình xóa nó đi:

UPDATE products
SET categories = array_remove(categories, 'Pho bien')
WHERE name = 'Dien thoai';

-- Kiểm tra kết quả:
SELECT * FROM products;

Kết quả:

id name categories
1 Dien thoai {Dien tu,Gadget}
2 Laptop {May tinh,Dien tu}
Lưu ý:

nếu phần tử bạn muốn xóa không có trong mảng, array_remove() sẽ giữ nguyên mảng không thay đổi. Rất tiện vì sẽ không có lỗi gì xảy ra cả.

Kết hợp array_append()array_remove()

Đôi khi cần chắc chắn phần tử chưa có trong mảng rồi mới thêm vào. Có thể làm bằng cách kết hợp các hàm:

Ví dụ: Thêm phần tử duy nhất

Đảm bảo thành viên có ID 7 chỉ được thêm vào mảng nếu chưa có. Dùng kiểm tra với array_remove() nhé:

UPDATE projects
SET team_members = array_append(team_members, 7)
WHERE name = 'Du an A' AND NOT (team_members @> ARRAY[7]);

-- Kiểm tra kết quả:
SELECT * FROM projects;

Giải thích:

  • Toán tử @> kiểm tra xem mảng có chứa phần tử 7 không.
  • Nếu team_members đã có 7 rồi thì sẽ không thêm nữa.

Lỗi thường gặp và tips

1. Thử thêm NULL vào mảng. Nếu bạn thử dùng array_append() với NULL (ví dụ array_append(team_members, NULL)), nó sẽ thêm giá trị NULL vào mảng. Không báo lỗi gì đâu, nhưng kết quả có thể không như ý. Để tránh, hãy kiểm tra giá trị không phải NULL trước khi thêm.

-- Ví dụ kiểm tra:
UPDATE projects
SET team_members = array_append(team_members, COALESCE(NULL, -1))
WHERE name = 'Du an A';

2. Kiểu dữ liệu khác nhau trong mảng. Mảng trong PostgreSQL phải chứa cùng kiểu dữ liệu. Ví dụ, không thể thêm chuỗi vào mảng số:

-- Cái này sẽ báo lỗi:
UPDATE projects
SET team_members = array_append(team_members, 'example');

Để tránh lỗi, hãy chắc chắn kiểu dữ liệu khớp nhau. Nếu không chắc, ép kiểu bằng :: nhé:

-- Ví dụ ép kiểu:
UPDATE projects
SET team_members = array_append(team_members, '5'::INT);
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION