📖 Scenario: You are building a blog application with Supabase. You need to create the database schema with a users table and a posts table with a foreign key relationship. You'll write the SQL that the dashboard generates behind the scenes.
🎯 Goal: Create two related tables with proper primary keys, constraints, foreign keys, and Row Level Security enabled.
📋 What You'll Learn
Create a users table with UUID primary key and email
Create a posts table with foreign key to users
Enable Row Level Security on both tables
Add a basic RLS policy for authenticated read access
💡 Why This Matters
🌍 Real World
Every Supabase application needs tables with proper RLS policies. The dashboard provides a visual way to create them, but understanding the generated SQL is essential for migrations and debugging.
💼 Career
Full-stack developers using Supabase must understand table creation, foreign keys, and RLS to build secure applications.
Progress0 / 4 steps
1
Create the users table
Create a table public.users with columns: id as UUID with default gen_random_uuid() as PRIMARY KEY, email as TEXT NOT NULL UNIQUE, and created_at as TIMESTAMPTZ with default now().
Supabase
Hint
Use gen_random_uuid() as the default value for UUID primary keys in Supabase.
2
Create the posts table with foreign key
Create a table public.posts with columns: id as BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, user_id as UUID referencing public.users(id) with ON DELETE CASCADE, title as TEXT NOT NULL, and created_at as TIMESTAMPTZ with default now().
Supabase
Hint
Use REFERENCES public.users(id) ON DELETE CASCADE to create the foreign key with cascade delete.
3
Enable Row Level Security
Enable Row Level Security on both public.users and public.posts tables using ALTER TABLE ... ENABLE ROW LEVEL SECURITY.
Supabase
Hint
Use ALTER TABLE table_name ENABLE ROW LEVEL SECURITY for each table.
4
Add a read policy for authenticated users
Create a policy named "Users can read all posts" on public.posts for SELECT using the role authenticated with the check (true) to allow all authenticated users to read posts.
Supabase
Hint
Use CREATE POLICY name ON table FOR SELECT TO role USING (expression).
Practice
(1/5)
1. What is the main purpose of creating tables via the Supabase dashboard?
easy
A. To deploy applications directly from the dashboard
B. To write complex SQL queries manually
C. To create user interface designs
D. To organize data with clear columns and constraints without coding
Solution
Step 1: Understand the dashboard's role
The Supabase dashboard allows users to create tables visually without writing code.
Step 2: Identify the main benefit
This method helps organize data clearly with columns and constraints easily set up.
Final Answer:
To organize data with clear columns and constraints without coding -> Option D
Quick Check:
Dashboard table creation = Organize data visually [OK]
Hint: Dashboard tables = visual data organization, no code needed [OK]
Common Mistakes:
Confusing dashboard with SQL query writing
Thinking dashboard creates app UI
Assuming dashboard deploys apps
2. Which step is required to add a new column when creating a table in the Supabase dashboard?
easy
A. Run a database migration script
B. Write a SQL INSERT statement
C. Click 'Add Column' and define the column name and type
D. Upload a CSV file with column data
Solution
Step 1: Locate the column addition feature
In the Supabase dashboard, you add columns by clicking the 'Add Column' button.
Step 2: Define column details
After clicking, you specify the column name and data type to create it.
Final Answer:
Click 'Add Column' and define the column name and type -> Option C
Quick Check:
Add column = Click button + define name/type [OK]
Hint: Add columns by clicking 'Add Column' and setting details [OK]
Common Mistakes:
Confusing column addition with data insertion
Trying to upload data instead of defining structure
Running scripts instead of using dashboard UI
3. After creating a table with columns id (integer, primary key) and name (text) via the Supabase dashboard, what will be the result of inserting {id: 1, name: 'Alice'} and then querying all rows?
medium
A. [{id: 1, name: 'Alice'}]
B. Error: Missing table schema
C. Empty result set
D. [{name: 'Alice'}]
Solution
Step 1: Understand table schema and insert
The table has columns 'id' as primary key and 'name' as text. Inserting {id:1, name:'Alice'} matches schema.
Step 2: Query all rows after insert
Querying all rows returns the inserted row as [{id: 1, name: 'Alice'}].
4. You tried to create a table via the Supabase dashboard but received an error saying the column name is invalid. What is the most likely cause?
medium
A. Not selecting a data type for the column
B. Using spaces or special characters in the column name
C. Adding too many columns at once
D. Not clicking the 'Save' button after creation
Solution
Step 1: Identify invalid column name causes
Column names cannot contain spaces or special characters in Supabase.
Step 2: Recognize common naming rules
Valid names use letters, numbers, and underscores only.
Final Answer:
Using spaces or special characters in the column name -> Option B
Quick Check:
Invalid column name = spaces/special chars [OK]
Hint: Use only letters, numbers, underscores in column names [OK]
Common Mistakes:
Ignoring naming rules and using spaces
Forgetting to select data type (usually warned separately)
Assuming too many columns cause naming errors
5. You want to create a table for customer orders with columns: order_id (primary key), customer_id, order_date, and total_amount. Which approach via the Supabase dashboard ensures data integrity and efficient queries?
hard
A. Set order_id as primary key, customer_id as foreign key, and choose appropriate data types
B. Create all columns as text type for flexibility
C. Skip primary key to allow duplicate orders
D. Add only order_id and total_amount columns
Solution
Step 1: Define primary key for uniqueness
Setting order_id as primary key ensures each order is unique.
Step 2: Use foreign key and proper data types
Defining customer_id as foreign key links orders to customers; choosing correct data types improves query efficiency.
Final Answer:
Set order_id as primary key, customer_id as foreign key, and choose appropriate data types -> Option A
Quick Check:
Primary + foreign keys + data types = data integrity [OK]
Hint: Use keys and correct types for integrity and speed [OK]
Common Mistakes:
Using text for all columns losing type benefits
Skipping primary key causing duplicates
Ignoring foreign key relationships
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.