Trong kỷ nguyên của tự động hóa và tích hợp hệ thống (system integration), việc đồng bộ dữ liệu giữa các nền tảng khác nhau là một trong những tác vụ phổ biến nhất nhưng cũng đầy thách thức. Bạn có một danh sách khách hàng từ CRM, một bảng sản phẩm từ file Excel, hay dữ liệu cảm biến từ IoT, và bạn cần đưa chúng vào cơ sở dữ liệu Supabase của mình.
Vấn đề nảy sinh khi bạn phải trả lời câu hỏi: “Dữ liệu này đã tồn tại chưa?”. Nếu chưa, bạn cần Thêm mới (Insert). Nếu rồi, bạn cần Cập nhật (Update). Quy trình này được gọi là Upsert.
Trong bài viết này, chúng ta sẽ đi sâu vào cách sử dụng node Supabase Upsert tuỳ chỉnh trong n8n để giải quyết bài toán này một cách triệt để, hiệu quả và tối ưu hiệu suất.

Nỗi đau của việc đồng bộ dữ liệu thủ công
Trước khi đi vào giải pháp, hãy nhìn lại cách chúng ta thường xử lý vấn đề này theo cách truyền thống trong n8n. Thông thường, bạn sẽ phải xây dựng một luồng làm việc (workflow) khá cồng kềnh:
- Lấy dữ liệu nguồn: Đọc từ Google Sheets, Webhook, hoặc API.
- Tra cứu trong Supabase: Dùng một node Supabase để “Select” xem bản ghi có ID tương ứng đã tồn tại hay chưa.
- Kiểm tra điều kiện (IF node):
- Nếu dữ liệu trả về rỗng (True) -> Chuyển sang nhánh Insert.
- Nếu dữ liệu có trả về (False) -> Chuyển sang nhánh Update.
- Thực thi: Chạy node Insert hoặc Update tương ứng.
Cách làm này có nhiều nhược điểm chết người:
- Tốn kém tài nguyên: Bạn phải thực hiện ít nhất 2 requests (Select + Insert/Update) cho mỗi dòng dữ liệu.
- Chậm chạp: Khi xử lý hàng nghìn dòng, độ trễ mạng (latency) sẽ làm workflow chạy rất lâu.
- Khó bảo trì: Workflow trở nên phức tạp với nhiều dây nối chằng chịt, dễ sai sót logic.
- Rủi ro Race Condition: Trong môi trường đa luồng (multi-thread), có thể xảy ra trường hợp hai quy trình cùng kiểm tra và cùng thấy dữ liệu chưa tồn tại, dẫn đến việc cả hai cùng Insert và gây ra lỗi trùng lặp.
Giải pháp: Node Supabase Upsert Tuỳ Chỉnh
Node Supabase Upsert tuỳ chỉnh được sinh ra để loại bỏ hoàn toàn những phức tạp trên. Nó đóng gói toàn bộ logic “Kiểm tra và Quyết định” vào một thao tác duy nhất ngay tại phía cơ sở dữ liệu (Database level).
Thay vì n8n phải “hỏi” Supabase rồi mới “làm”, n8n chỉ cần “ra lệnh”: “Hãy đảm bảo dữ liệu này nằm trong bảng, nếu có rồi thì cập nhật, chưa có thì tạo mới”. Supabase sẽ tự lo phần còn lại.
Tại sao Node này vượt trội?
- Hiệu suất tối đa: Giảm số lượng API call xuống một nửa hoặc thậm chí là 1000 lần nếu dùng chế độ Batch.
- Đơn giản hoá Workflow: Thay thế 3-4 node phức tạp bằng 1 node duy nhất.
- Nguyên tử tính (Atomicity): Đảm bảo tính toàn vẹn dữ liệu, tránh lỗi Race Condition.
Các tính năng đột phá
Hãy cùng phân tích sâu hơn về các tính năng mà node này cung cấp:
1. Tự động Upsert dựa trên khoá duy nhất
Sức mạnh cốt lõi của node nằm ở khả năng xác định “danh tính” của bản ghi. Thông qua tham số “On Conflict”, bạn chỉ định cột nào đang chứa giá trị duy nhất (Unique Key).
Ví dụ: Nếu bạn đồng bộ người dùng, “email” là duy nhất. Bạn điền “email” vào “On Conflict”. Khi n8n gửi một user có email “test@example.com”:
- Nếu Supabase không tìm thấy “test@example.com” -> Tạo user mới.
- Nếu tìm thấy -> Cập nhật các thông tin khác (tên, tuổi, địa chỉ…) của user đó.
2. Xử lý hàng loạt (Batch Processing)
Đây là tính năng “sát thủ” cho các tác vụ Big Data. Khi bạn bật tuỳ chọn Send All Items, node sẽ không gửi từng dòng một. Thay vào đó, nó gom toàn bộ input items (ví dụ: 5000 sản phẩm) thành một mảng JSON khổng lồ và gửi đi trong một request duy nhất.
Điều này giúp giảm thời gian chạy từ vài phút xuống chỉ còn vài giây.
3. Chiến lược giải quyết xung đột (Conflict Resolution)
Không phải lúc nào Update cũng là điều bạn muốn. Node cung cấp 2 chiến lược:
- Merge (Mặc định): Hành vi Upsert chuẩn. Dữ liệu mới sẽ ghi đè lên dữ liệu cũ. Phù hợp để đồng bộ hoá trạng thái mới nhất.
- Ignore: “Giữ nguyên bản gốc”. Nếu dữ liệu đã tồn tại, Supabase sẽ không làm gì cả, chỉ Insert những dòng mới. Phù hợp cho việc import dữ liệu lịch sử hoặc log, nơi bạn không muốn thay đổi những gì đã ghi nhận.
4. Linh hoạt nguồn dữ liệu
Bạn có thể dùng dữ liệu từ:
- Input Items: Dữ liệu chuẩn chảy từ các node trước trong n8n.
- JSON Raw: Nhập trực tiếp chuỗi JSON hoặc dùng Expression để tuỳ biến cấu trúc dữ liệu phức tạp mà không cần dùng node “Function” hay “Set” trước đó.

Hướng dẫn cấu hình chi tiết từng bước
Để giúp bạn làm chủ node này, hãy đi qua từng tham số cấu hình:
Bước 1: Kết nối (Credentials)
Bạn cần tạo một Credential mới loại “Supabase Upsert API”.
- Project URL: Tìm trong Settings -> API của dashboard Supabase. Dạng “https://xyz.supabase.co”.
- Service Role Key: Lưu ý quan trọng, bạn nên dùng “service_role” key thay vì “anon” key để có quyền bypass RLS (Row Level Security) khi cần thiết và thực hiện các thao tác ghi hàng loạt không bị giới hạn quyền.
Bước 2: Chọn bảng (Table)
Sau khi kết nối, node sẽ tự động tải danh sách các bảng trong database của bạn. Hãy chọn đúng bảng đích, ví dụ “products” hoặc “customers”.
Bước 3: Cấu hình Upsert (Quan trọng nhất)
- On Conflict: Nhập tên cột có ràng buộc duy nhất (Unique Constraint).
- Mẹo: Nếu bạn dùng khoá chính phức hợp (Composite Key, ví dụ: order_id + product_id), hãy nhập chúng cách nhau bằng dấu phẩy: order_id, product_id.
- Resolution:
- Chọn “Merge” để luôn cập nhật giá trị mới nhất.
- Chọn “Ignore” nếu bạn chỉ muốn chèn dữ liệu thiệu.
Bước 4: Tuỳ chọn nâng cao
- Return: Chọn “Representation” để node trả về dữ liệu vừa được Insert/Update (hữu ích để lấy ID tự sinh). Chọn “Minimal” nếu bạn không cần quan tâm kết quả trả về để tiết kiệm băng thông mạng.
Kịch bản ứng dụng thực tế (Use Cases)
Kịch bản 1: Đồng bộ tồn kho E-commerce (High Volume)
Bạn có một file CSV chứa 10.000 sản phẩm từ kho tổng, cập nhật mỗi giờ.
- Cấu hình:
- Table: “inventory”
- On Conflict: “sku” (Mã sản phẩm)
- Resolution: “Merge”
- Send All Items: “True”
- Kết quả: Cập nhật số lượng tồn kho cho 10.000 sản phẩm chỉ trong vòng 1-2 giây. Những mã SKU mới sẽ tự động được thêm vào hệ thống bán hàng.
Kịch bản 2: Thu thập Lead từ Landing Page
Bạn chạy quảng cáo trên nhiều kênh, dữ liệu đổ về Webhook. Một khách hàng có thể đăng ký nhiều lần.
- Cấu hình:
- Table: “leads”
- On Conflict: “email”
- Resolution: “Ignore”
- Kết quả: Bạn chỉ lưu giữ thông tin của lần đăng ký đầu tiên (First Touch Attribution). Những lần đăng ký sau sẽ bị bỏ qua, tránh làm loãng dữ liệu CRM.
Kịch bản 3: IoT Sensor Logging
Hệ thống cảm biến gửi nhiệt độ mỗi 5 phút. Đôi khi mạng chập chờn, cảm biến gửi lại gói tin cũ.
- Cấu hình:
- Table: “sensor_readings”
- On Conflict: “device_id, timestamp”
- Resolution: “Merge”
- Kết quả: Đảm bảo tại một thời điểm, mỗi thiết bị chỉ có đúng một bản ghi. Nếu dữ liệu được gửi lại, nó sẽ ghi đè lên bản cũ (thường là giống nhau), giữ cho database sạch sẽ.
Các lưu ý và rủi ro thường gặp
- Lỗi “On Conflict”: Nếu bạn nhập sai tên cột hoặc cột đó không có ràng buộc “UNIQUE” trong database, Supabase sẽ báo lỗi. Hãy chắc chắn bạn đã tạo Unique Index cho cột đó trong SQL Editor.
- SQL tạo index: CREATE UNIQUE INDEX idx_users_email ON public.users (email);
- Giới hạn kích thước Request: Mặc dù “Send All Items” rất mạnh, nhưng Supabase có giới hạn kích thước body (thường là vài MB). Nếu bạn gửi 100.000 dòng một lúc có thể bị lỗi. Hãy chia nhỏ (Split in Batches) thành các cụm 1.000 – 5.000 dòng.
- Quyền truy cập (RLS): Nếu dùng “anon” key, hãy đảm bảo bạn đã cấu hình Row Level Security cho phép Insert/Update. Tốt nhất cho backend workflow là dùng “service_role” key.
Kết luận
Node Supabase Upsert không chỉ là một công cụ tiện ích, nó là “xương sống” cho các quy trình tích hợp dữ liệu hiệu suất cao trong n8n. Việc hiểu và áp dụng đúng node này sẽ giúp bạn tiết kiệm hàng giờ debug, giảm tải cho máy chủ và mang lại trải nghiệm mượt mà cho hệ thống.
Nếu bạn đang xây dựng các hệ thống automation phức tạp với Supabase, đây chắc chắn là node bạn không thể bỏ qua. Hãy cài đặt, trải nghiệm và cảm nhận tốc độ vượt trội ngay hôm nay!