Skip to main content

Creating and Altering Tables

Our marketplace database is already useful, but real systems evolve. New requirements appear - perhaps we need to track warehouses, shipment tracking, or seller payouts. This lesson shows how to create new tables, define constraints, and adapt existing structures safely.

Learning Goals

  • Create tables that extend the marketplace schema
  • Choose data types and constraints that match commerce data
  • Use ALTER TABLE to evolve existing structures
  • Recognize when to alter versus rebuild a table

Creating Tables

Start by identifying the columns, data types, and relationships. Suppose operations wants to track warehouses.

Create a warehouse table
CREATE TABLE warehouse (
warehouse_id INT AUTO_INCREMENT PRIMARY KEY,
warehouse_name VARCHAR(120) NOT NULL,
city VARCHAR(80) NOT NULL
);

Now link products to warehouses with stock counts:

Create a product_warehouse bridge table
CREATE TABLE product_warehouse (
product_id INT NOT NULL,
warehouse_id INT NOT NULL,
on_hand INT NOT NULL CHECK (on_hand >= 0),
PRIMARY KEY (product_id, warehouse_id),
FOREIGN KEY (product_id) REFERENCES product(product_id),
FOREIGN KEY (warehouse_id) REFERENCES warehouse(warehouse_id)
);

This design enforces that every inventory row references valid records on both sides.

Choosing Data Types and Constraints

Relational structure is about trust. Use constraints to assert what must hold true.

Shipment tracking with constraints
CREATE TABLE shipment (
shipment_id INT AUTO_INCREMENT PRIMARY KEY,
order_id INT NOT NULL,
carrier VARCHAR(80) NOT NULL,
tracking_number VARCHAR(80) NOT NULL UNIQUE,
shipped_at DATE NOT NULL,
estimated_days INT NOT NULL CHECK (estimated_days > 0),
FOREIGN KEY (order_id) REFERENCES orders(order_id)
);
  • CHECK (estimated_days > 0) guarantees positive transit times.
  • tracking_number is unique so a shipment is easy to locate.

Altering Existing Tables

Schemas change. Use ALTER TABLE to evolve them while preserving existing data.

Add a Column

Track customer phone numbers
ALTER TABLE customer
ADD COLUMN phone VARCHAR(30);

New rows can populate phone, while existing rows default to NULL.

Modify a Column

MySQL supports most alteration operations, but large tables can still require careful planning because changes may lock the table.

ALTER TABLE orders
MODIFY COLUMN status VARCHAR(30) DEFAULT 'Pending';

When a change is too disruptive, create a new table, copy data, and rename - most ORMs provide helpers for this.

Drop a Column

Remove optional phone numbers
ALTER TABLE customer
DROP COLUMN phone;

This permanently removes the phone column and its data. Export important values before dropping them.

Renaming and Adding Constraints

Rename columns or tables
ALTER TABLE product RENAME COLUMN product_name TO name;
ALTER TABLE orders RENAME TO customer_order;
Add a constraint after table creation
ALTER TABLE seller
ADD CONSTRAINT store_name_unique UNIQUE (store_name);

Adding constraints later is common when legacy data needs cleanup first. Validate that existing rows obey the new rule before enforcing it.

When to Alter vs Rebuild

  • Alter in place for small, backward-compatible changes (add column, rename column/table, add indexes, enforce new uniqueness).
  • Rebuild when you drastically change relationships, swap data types that aren't compatible, or need to backfill columns with computed values. In practice you'll:
    1. Create a new table with the desired structure.
    2. Copy data over with INSERT ... SELECT.
    3. Drop the old table and rename the new one.

Always run these steps inside a transaction to protect against partial failures.

Summary

  • CREATE TABLE defines columns, data types, defaults, and relationships.
  • Constraints (PRIMARY KEY, NOT NULL, UNIQUE, CHECK, FOREIGN KEY) uphold data quality for marketplace records.
  • ALTER TABLE adapts existing structures - add columns, rename objects, and enforce new business rules.
  • Evaluate impact before altering production tables; plan migrations that keep data safe.

Quiz

Show quiz
  1. Which constraint ensures every tracking number is different?
    A) PRIMARY KEY
    B) NOT NULL
    C) UNIQUE
    D) CHECK

  2. Why does the product_warehouse table use a composite primary key?
    A) To auto-increment warehouse IDs
    B) To allow duplicate assignments
    C) To prevent the same product-warehouse pair from being stored twice
    D) To improve text search

  3. What should you do before dropping a column that may contain important data?
    A) Nothing - dropping preserves values automatically
    B) Create a backup or export of the data
    C) Change its data type to text
    D) Rename the table first

  4. True or False: Adding a new column with ALTER TABLE affects existing rows immediately.
    A) True, new rows must supply a value
    B) False, existing rows receive NULL (unless a default is specified)


Answers

  1. C
  2. C
  3. B
  4. B