Hướng dẫn tạo dữ liệu SQL trong Supabase chi tiết

Supabase là nền tảng BaaS (Backend-as-a-Service) mã nguồn mở hàng đầu hiện nay, cung cấp cho các nhà phát triển một hệ quản trị cơ sở dữ liệu PostgreSQL đầy đủ tính năng. Việc khởi tạo cơ sở dữ liệu, phân quyền bảo mật RLS và nạp dữ liệu thử nghiệm bằng câu lệnh SQL là bước đầu tiên quan trọng để phát triển ứng dụng hoặc tích hợp các công cụ AI như ChatGPT.

Bài viết này sẽ hướng dẫn bạn từng bước từ khâu truy cập trang quản trị, tạo dự án cho đến việc khởi chạy kịch bản SQL Migration và kiểm tra dữ liệu trực quan trên Supabase.

Xem thêm: Hướng dẫn thêm Supabase Plugin trên ChatGPT

1. Truy cập trang quản trị Supabase

Để bắt đầu làm việc với cơ sở dữ liệu, bạn cần truy cập vào hệ thống Supabase Dashboard:

Truy cập trang chủ chính thức của Supabase ở dưới đây.

https://supabase.com/

Tại góc trên bên phải màn hình giao diện, nhấp vào nút Dashboard để tiến hành đăng nhập vào hệ thống.

hướng dẫn tạo dữ liệu sql trong supabase

2. Khởi tạo tổ chức (Organization) và dự án (Project) mới

Nếu chưa có dự án sẵn có, bạn cần tạo một môi trường làm việc chứa cơ sở dữ liệu PostgreSQL:

Tại giao diện Your organizations, nếu bạn cần tạo không gian làm việc mới, hãy nhấp vào nút + New organization ở góc phải.

dữ liệu sql trong supabase

Trong danh sách không gian làm việc (ví dụ: quantrimang35@gmail.com's Org ), chọn dự án có sẵn hoặc nhấn nút + New project (hoặc nút + New project chính giữa màn hình bên dưới dòng chữ Create a project).

cách tạo dữ liệu sql trong supabase

Tại giao diện Create a new project:

  • Organization: Chọn tổ chức quản lý dự án.
  • Project name: Nhập tên dự án đại diện (ví dụ: quantrimang35 ).
  • Database password: Nhập mật khẩu bảo mật cho PostgreSQL database.
  • Region: Chọn khu vực máy chủ phù hợp (khuyên dùng Singapore để đạt tốc độ tối ưu).
hướng dẫn tạo dữ liệu trong supabase

Nhấn nút khởi tạo và đợi 1–2 phút để hệ thống thiết lập hạ tầng.

3. Tạo SQL Editor

Sau khi dự án đã sẵn sàng, bạn sử dụng công cụ SQL Editor để khởi tạo cấu trúc bảng, kích hoạt chính sách bảo mật RLS (Row Level Security) và nạp dữ liệu mẫu:

tạo database supabase

Ở thanh menu điều hướng bên trái màn hình Dashboard, nhấp vào biểu tượng SQL Editor (biểu tượng thẻ SQL <> ).

Nhấn vào nút + New (hoặc mở một tab query trống).

supabase sql editor tutorial

Sao chép các đoạn mã SQL Migration chuẩn dưới đây và dán vào ô soạn thảo, lấy đoạn mã phù hợp với nhu cầu của bạn nhé.

1. Thương Mại Điện Tử (E-commerce): Bảng Sản Phẩm & Quản Lý Tồn Kho

Dành cho việc lưu trữ sản phẩm, giá bán, số lượng tồn kho và tự động cập nhật thời gian sửa đổi.

SQL

-- Tạo bảng sản phẩmCREATE TABLE IF NOT EXISTS public.ecom_products (

id UUID DEFAULT gen_random_uuid() PRIMARY KEY,

sku VARCHAR ( 50 ) NOT NULL UNIQUE ,

name VARCHAR ( 255 ) NOT NULL ,

description TEXT,

price NUMERIC ( 12 , 2 ) NOT NULL CHECK (price >= 0 ),

stock_quantity INT DEFAULT 0 CHECK (stock_quantity >= 0 ),

is_published BOOLEAN DEFAULT false ,

created_at TIMESTAMPTZ DEFAULT now() NOT NULL ,

updated_at TIMESTAMPTZ DEFAULT now() NOT NULL

);

-- Bật bảo mật RLS & Tạo Policy đọc công khai cho sản phẩm đã xuất bảnALTER TABLE public.ecom_products ENABLE ROW LEVEL SECURITY;

CREATE POLICY "Public products are viewable by everyone" ON public.ecom_products FOR SELECT USING (is_published = true );

2. Lĩnh vực quản lý người dùng và hồ sơ

Kết nối trực tiếp với hệ thống xác thực auth.users của Supabase để tự động tạo hồ sơ người dùng khi có tài khoản mới đăng ký.

SQL

-- Tạo bảng Hồ sơ người dùngCREATE TABLE IF NOT EXISTS public.user_profiles (

id UUID PRIMARY KEY REFERENCES auth.users(id) ON DELETE CASCADE,

full_name VARCHAR ( 150 ),

avatar_url TEXT,

phone_number VARCHAR ( 20 ),

role VARCHAR ( 20 ) DEFAULT 'customer' CHECK (role IN ( 'customer' , 'seller' , 'admin' )),

created_at TIMESTAMPTZ DEFAULT now() NOT NULL

);

-- Bật RLS: Người dùng chỉ được phép đọc và sửa hồ sơ của chính mìnhALTER TABLE public.user_profiles ENABLE ROW LEVEL SECURITY;

CREATE POLICY "Users can view own profile" ON public.user_profiles FOR SELECT USING (auth.uid() = id);

CREATE POLICY "Users can update own profile" ON public.user_profiles FOR UPDATE USING (auth.uid() = id);

3. Lĩnh vực tìm kiếm AI & Vector Storage

Sử dụng tiện ích mở rộng pgvector của Supabase để lưu trữ chuỗi nhúng Vector Embeddings phục vụ việc tìm kiếm ngữ nghĩa.

SQL

-- Kích hoạt tiện ích mở rộng pgvectorCREATE EXTENSION IF NOT EXISTS vector;

-- Tạo bảng lưu trữ tài liệu AI và chuỗi nhúng 1536 chiều (chuẩn OpenAI)CREATE TABLE IF NOT EXISTS public.ai_documents (

id UUID DEFAULT gen_random_uuid() PRIMARY KEY,

content TEXT NOT NULL ,

metadata JSONB,

embedding VECTOR( 1536 ),

created_at TIMESTAMPTZ DEFAULT now() NOT NULL

);

-- Tạo chỉ mục HNSW để tăng tốc độ tìm kiếm vector tương đồngCREATE INDEX ON public.ai_documents USING hnsw (embedding vector_cosine_ops);

4. Lĩnh vực Blog và tạp chí công nghệ

Tạo bảng bài viết hỗ trợ truy vấn nhanh theo đường dẫn thân thiện (Slug) và đếm số lượt xem.

SQL

CREATE TABLE IF NOT EXISTS public.articles (

id UUID DEFAULT gen_random_uuid() PRIMARY KEY,

author_id UUID REFERENCES public.user_profiles(id) ON DELETE SET NULL ,

title VARCHAR ( 255 ) NOT NULL ,

slug VARCHAR ( 255 ) NOT NULL UNIQUE ,

content TEXT NOT NULL ,

view_count INT DEFAULT 0 ,

status VARCHAR ( 20 ) DEFAULT 'draft' CHECK (status IN ( 'draft' , 'published' , 'archived' )),

published_at TIMESTAMPTZ

);

-- Đánh chỉ mục (Index) trên Slug để tối ưu tốc độ đọc bài viết theo URLCREATE INDEX idx_articles_slug ON public.articles(slug);

5. Lĩnh vực tài chính và giao dịch

Ghi chép lịch sử nạp/rút tiền hoặc thanh toán với tính chất toàn vẹn dữ liệu cao.

SQL

CREATE TABLE IF NOT EXISTS public.financial_transactions (

id UUID DEFAULT gen_random_uuid() PRIMARY KEY,

user_id UUID NOT NULL REFERENCES auth.users(id),

amount NUMERIC ( 15 , 2 ) NOT NULL ,

transaction_type VARCHAR ( 20 ) NOT NULL CHECK (transaction_type IN ( 'deposit' , 'withdrawal' , 'payment' )),

status VARCHAR ( 20 ) DEFAULT 'pending' CHECK (status IN ( 'pending' , 'completed' , 'failed' )),

reference_code VARCHAR ( 100 ) UNIQUE ,

created_at TIMESTAMPTZ DEFAULT now() NOT NULL

);

ALTER TABLE public.financial_transactions ENABLE ROW LEVEL SECURITY;

-- Chỉ chủ sở hữu mới có quyền xem lịch sử giao dịch của mìnhCREATE POLICY "Users can view own transactions" ON public.financial_transactions FOR SELECT USING (auth.uid() = user_id);

6. Lĩnh vực giáo dục khóa học trực tuyến

Quản lý danh sách các khóa học, độ khó và giá bán.

SQL

CREATE TABLE IF NOT EXISTS public.courses (

id UUID DEFAULT gen_random_uuid() PRIMARY KEY,

title VARCHAR ( 200 ) NOT NULL ,

description TEXT,

level VARCHAR ( 20 ) DEFAULT 'beginner' CHECK (level IN ( 'beginner' , 'intermediate' , 'advanced' )),

price NUMERIC ( 10 , 2 ) DEFAULT 0.00 ,

thumbnail_url TEXT,

created_at TIMESTAMPTZ DEFAULT now() NOT NULL

);

-- Index tìm kiếm khóa học theo trình độCREATE INDEX idx_courses_level ON public.courses(level);

7. Lĩnh vực bất động sản

Lưu trữ thông tin dự án/nhà đất, sử dụng kiểu dữ liệu JSONB linh hoạt cho các thuộc tính bổ sung (tiện ích, số phòng...).

SQL

CREATE TABLE IF NOT EXISTS public.real_estate_properties (

id UUID DEFAULT gen_random_uuid() PRIMARY KEY,

title VARCHAR ( 255 ) NOT NULL ,

address TEXT NOT NULL ,

city VARCHAR ( 100 ) NOT NULL ,

price_vnd NUMERIC ( 15 , 0 ) NOT NULL ,

area_sqm NUMERIC ( 8 , 2 ) NOT NULL ,

attributes JSONB DEFAULT '{}' ::jsonb, -- Lưu số phòng ngủ, hướng nhà, nội thất...

is_available BOOLEAN DEFAULT true

);

-- Index hỗ trợ lọc danh sách theo thành phốCREATE INDEX idx_properties_city ON public.real_estate_properties(city);

8. Lĩnh vực Y Tế & đặt lịch hẹn

Quản lý lịch khám bệnh giữa Bác sĩ và Bệnh nhân.

SQL

CREATE TABLE IF NOT EXISTS public.medical_appointments (

id UUID DEFAULT gen_random_uuid() PRIMARY KEY,

patient_id UUID NOT NULL REFERENCES public.user_profiles(id),

doctor_id UUID NOT NULL REFERENCES public.user_profiles(id),

appointment_time TIMESTAMPTZ NOT NULL ,

reason TEXT,

status VARCHAR ( 20 ) DEFAULT 'scheduled' CHECK (status IN ( 'scheduled' , 'completed' , 'cancelled' )),

created_at TIMESTAMPTZ DEFAULT now() NOT NULL

);

ALTER TABLE public.medical_appointments ENABLE ROW LEVEL SECURITY;

-- Bệnh nhân chỉ thấy lịch hẹn của chính mìnhCREATE POLICY "Patients view own appointments" ON public.medical_appointments FOR SELECT USING (auth.uid() = patient_id);

9. Lĩnh vực đặt phòng khách sạn và du lịch

Kiểm tra khoảng thời gian nhận phòng / trả phòng.

SQL

CREATE TABLE IF NOT EXISTS public.hotel_bookings (

id UUID DEFAULT gen_random_uuid() PRIMARY KEY,

room_number VARCHAR ( 20 ) NOT NULL ,

customer_name VARCHAR ( 150 ) NOT NULL ,

check_in_date DATE NOT NULL ,

check_out_date DATE NOT NULL ,

total_price NUMERIC ( 12 , 2 ) NOT NULL ,

CONSTRAINT valid_dates CHECK (check_out_date > check_in_date)

);

10. Tự động hóa hệ thống: Trigger tự động update

Hàm Trigger chung có thể tái sử dụng cho tất cả các bảng trên Supabase để mỗi khi bản ghi có chỉnh sửa ( UPDATE ), thời gian updated_at sẽ tự động làm mới.

SQL

-- Tạo hàm tự động cập nhật thời gianCREATE OR REPLACE FUNCTION update_updated_at_column() RETURNS TRIGGER AS $$ BEGIN

NEW.updated_at = now();

RETURN NEW ; END ;

$$ LANGUAGE plpgsql;

-- Gán Trigger vào bảng ecom_products (Áp dụng tương tự cho các bảng khác)CREATE TRIGGER set_updated_at_ecom_products

BEFORE UPDATE ON public.ecom_products FOR EACH ROWEXECUTE FUNCTION update_updated_at_column();
thêm dữ liệu mẫu supabase postgresql

Nhấn nút Run (màu xanh lá ở góc trên bên phải) để thực thi đoạn mã. Khi phần thông báo hiển thị Success. No rows returned, nghĩa là hệ thống đã tạo thành công các bảng và chèn dữ liệu.

4. Kiểm tra dữ liệu trực quan trong Table Editor

Để kiểm tra danh sách bản ghi vừa tạo mà không cần viết câu lệnh SELECT, bạn sử dụng giao diện Table Editor:

Nhấp vào mục Table Editor ở thanh menu bên trái (biểu tượng hình ô lưới nằm ngay trên SQL Editor).

cài đặt bảng supabase rls policy

Chọn bảng products trong danh sách để xem chi tiết các sản phẩm như Tai nghe chống ồn không dây, Smartphone Flagship X, Sạc dự phòng 20000mAh... kèm thông tin về giá bán và số lượng tồn kho.

hướng dẫn sử dụng supabase table editor

Việc khởi tạo cấu trúc bảng và nạp dữ liệu mẫu bằng SQL trên Supabase là bước đệm quan trọng giúp bạn nhanh chóng xây dựng nền tảng Back-end vững chắc cho ứng dụng của mình. Nhờ sự linh hoạt của hệ quản trị cơ sở dữ liệu PostgreSQL kết hợp với cơ chế bảo mật RLS mạnh mẽ, Supabase không chỉ tối ưu thời gian phát triển mà còn sẵn sàng kết nối mượt mà với các công cụ AI hiện đại như ChatGPT.

Thứ Hai, 02/11/2026 17:31
5 ★ 1 👨 21
#AI
Xác thực tài khoản!

Theo Nghị định 147/2024/ND-CP, bạn cần xác thực tài khoản trước khi sử dụng tính năng này. Chúng tôi sẽ gửi mã xác thực qua SMS hoặc Zalo tới số điện thoại mà bạn nhập dưới đây:

Số điện thoại chưa đúng định dạng!
Số điện thoại này đã được xác thực!
Bạn có thể dùng Sđt này đăng nhập tại đây!
Lỗi gửi SMS, liên hệ Admin
0 Bình luận
Sắp xếp theo