Working with JSONB Modification Functions in PostgreSQL
📖 Scenario: You are managing a PostgreSQL database for a small online bookstore. Each book's details are stored in a table with a jsonb column called details. This column holds information like the author, price, and stock status in JSON format.Your task is to learn how to update and modify this JSONB data using PostgreSQL's JSONB modification functions.
🎯 Goal: Build SQL queries that modify the details JSONB column by adding, updating, and removing keys using JSONB modification functions.
📋 What You'll Learn
Create a table called books with columns id (integer) and details (jsonb).
Insert a book record with specific JSONB data into the books table.
Write a query to update the price key inside the details JSONB column using the jsonb_set function.
Write a query to remove the stock key from the details JSONB column using the - operator.
💡 Why This Matters
🌍 Real World
Many modern applications store flexible data in JSONB columns in PostgreSQL. Knowing how to modify JSONB data directly in the database helps keep data consistent and reduces application complexity.
💼 Career
Database developers and backend engineers often need to update JSONB data efficiently. This skill is useful for maintaining product catalogs, user profiles, and other semi-structured data.
Progress0 / 4 steps
1
Create the books table and insert initial JSONB data
Create a table called books with columns id as integer and details as jsonb. Then insert one row with id 1 and details containing the JSON object: {"author": "Jane Austen", "price": 20, "stock": true}.
PostgreSQL
Hint
Use CREATE TABLE to define the table and INSERT INTO to add the JSONB data as a string.
2
Set a variable for the book ID to update
Create a variable called book_id and set it to 1. This will help us target the book record to update.
PostgreSQL
Hint
Use the psql command \set to create a variable for the book ID.
3
Update the price key in the JSONB column using jsonb_set
Write an UPDATE query that changes the price key inside the details JSONB column to 25 for the book with id equal to :book_id. Use the jsonb_set function with the path {"price"} and the new value as a JSON string.
PostgreSQL
Hint
Use jsonb_set(details, '{price}', '25'::jsonb) to update the price key.
4
Remove the stock key from the JSONB column using the - operator
Write an UPDATE query that removes the stock key from the details JSONB column for the book with id equal to :book_id. Use the - operator to delete the key.
PostgreSQL
Hint
Use details = details - 'stock' to remove the key.
Practice
(1/5)
1. What does the PostgreSQL function jsonb_set do when used on a JSONB column?
easy
A. It creates a new JSONB column in the table.
B. It deletes the entire JSONB column from the table.
C. It converts JSONB data into plain text format.
D. It updates or adds a value at a specified path inside the JSONB data.
Solution
Step 1: Understand the purpose of jsonb_set
The function jsonb_set is designed to update or add a value at a specific location inside JSONB data using a path.
Step 2: Compare with other options
The other options describe actions unrelated to jsonb_set's purpose, such as creating or deleting columns or converting data types.
Final Answer:
It updates or adds a value at a specified path inside the JSONB data. -> Option D
Quick Check:
jsonb_set updates JSONB data [OK]
Hint: jsonb_set changes or adds JSONB values at paths [OK]
Common Mistakes:
Thinking jsonb_set deletes data
Confusing jsonb_set with data type conversion
Assuming jsonb_set creates new columns
2. Which of the following is the correct syntax to remove a key named "age" from a JSONB column data in PostgreSQL?
easy
A. UPDATE table SET data = data - 'age';
B. UPDATE table SET data = jsonb_set(data, '{age}', NULL);
C. UPDATE table SET data = data + 'age';
D. UPDATE table SET data = jsonb_remove(data, 'age');
Solution
Step 1: Identify the correct operator for key removal
In PostgreSQL, the minus operator (-) removes a key from JSONB data, so data - 'age' removes the key "age".
Step 2: Check other options for correctness
UPDATE table SET data = jsonb_set(data, '{age}', NULL); tries to set the key to NULL but does not remove it. UPDATE table SET data = data + 'age'; adds a key, which is incorrect. UPDATE table SET data = jsonb_remove(data, 'age'); uses a non-existent function jsonb_remove.
Final Answer:
UPDATE table SET data = data - 'age'; -> Option A
Quick Check:
Minus operator removes JSONB key [OK]
Hint: Use minus (-) operator to remove JSONB keys [OK]
Common Mistakes:
Using jsonb_set with NULL to remove keys
Trying to add keys to remove them
Using non-existent functions like jsonb_remove
3. Given the JSONB column data with value '{"name": "Alice", "details": {"age": 30}}', what will be the result of this query?
SELECT jsonb_set(data, '{details,age}', '31', false) FROM table;
medium
A. {"name": "Alice", "details": {"age": 31}}
B. {"name": "Alice", "details": {"age": "31"}}
C. {"name": "Alice", "details": {"age": 30}}
D. {"name": "Alice", "details": {"age": null}}
Solution
Step 1: Understand jsonb_set parameters
The function jsonb_set updates the value at path '{details,age}' to '31' (a JSON string) because the new value is given as text, not as a number.
Step 2: Check the effect of the 'create_missing' flag
The last parameter is false, so it updates existing key without creating new ones. The age key is updated to the string '31', not the number 31.
Final Answer:
{"name": "Alice", "details": {"age": "31"}} -> Option B
Quick Check:
jsonb_set updates value as text unless cast [OK]
Hint: jsonb_set inserts text values unless cast to JSONB [OK]
Common Mistakes:
Assuming '31' is numeric without casting
Expecting no change when create_missing is false
Confusing JSON string and number types
4. You want to update a nested key in a JSONB column but your query
UPDATE table SET data = jsonb_set(data, '{info,score}', 100);
throws an error. What is the likely cause?
medium
A. The new value 100 is not cast to JSONB, causing a type error.
B. The path '{info,score}' is invalid syntax and must be a string.
C. jsonb_set cannot update nested keys, only top-level keys.
D. The data column is not JSONB type.
Solution
Step 1: Check the new value type in jsonb_set
The third argument must be JSONB type. Passing 100 as an integer without casting causes a type error.
Step 2: Verify other options
The path '{info,score}' is invalid syntax and must be a string. is incorrect because the path syntax is valid. jsonb_set cannot update nested keys, only top-level keys. is false; jsonb_set supports nested keys. The data column is not JSONB type. might cause error but question implies the error is from the query syntax.
Final Answer:
The new value 100 is not cast to JSONB, causing a type error. -> Option A
Quick Check:
jsonb_set value must be JSONB type [OK]
Hint: Cast new value to JSONB to avoid type errors [OK]
Common Mistakes:
Passing plain integers without casting
Misunderstanding path syntax
Assuming jsonb_set can't update nested keys
5. You have a JSONB column data storing user info. You want to increment the "visits" count inside "stats" by 1, but visits might be missing. Which query correctly updates data to add or increment visits?
hard
A. UPDATE table SET data = data || '{"stats":{"visits":1}}';
B. UPDATE table SET data = jsonb_set(data, '{stats,visits}', '1');
C. UPDATE table SET data = jsonb_set(data, '{stats,visits}', to_jsonb((COALESCE((data->'stats'->>'visits')::int, 0) + 1)));
D. UPDATE table SET data = jsonb_set(data, '{visits}', to_jsonb(1));
Solution
Step 1: Understand the need to increment or add visits
The query must get the current visits count, convert it to integer, handle missing key with COALESCE to 0, add 1, then convert back to JSONB.
Step 2: Analyze each option
UPDATE table SET data = jsonb_set(data, '{stats,visits}', to_jsonb((COALESCE((data->'stats'->>'visits')::int, 0) + 1))); correctly uses COALESCE and to_jsonb to update visits inside stats. UPDATE table SET data = jsonb_set(data, '{stats,visits}', '1'); sets visits to string '1' always. UPDATE table SET data = data || '{"stats":{"visits":1}}'; overwrites stats with visits=1, losing other keys. UPDATE table SET data = jsonb_set(data, '{visits}', to_jsonb(1)); updates visits at top level, not inside stats.
Final Answer:
UPDATE table SET data = jsonb_set(data, '{stats,visits}', to_jsonb((COALESCE((data->'stats'->>'visits')::int, 0) + 1))); -> Option C
Quick Check:
Use COALESCE and to_jsonb for safe increment [OK]
Hint: Use COALESCE and cast to increment JSONB numbers safely [OK]
Common Mistakes:
Overwriting nested objects accidentally
Not casting string to int before increment
Updating wrong JSONB path
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.