🗄️SQL Templates
CREATE TABLE & Schema Design
Define table schemas with proper data types, constraints, and relationships
Explanation
Create well-designed database schemas with appropriate columns, types, and constraints.
Examples
Basic table
Input
CREATE TABLE users (...)
Output
New table with columns
With constraints
Input
PRIMARY KEY, FOREIGN KEY, UNIQUE
Output
Enforced data integrity
Code Examples
SQL
-- Basic table creation
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(255) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- Table with foreign key
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
total DECIMAL(10, 2) NOT NULL,
status VARCHAR(20) DEFAULT 'pending',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
-- Many-to-many relationship
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
price DECIMAL(10, 2) NOT NULL
);
CREATE TABLE order_items (
id INT PRIMARY KEY AUTO_INCREMENT,
order_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL DEFAULT 1,
price DECIMAL(10, 2) NOT NULL,
FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE,
FOREIGN KEY (product_id) REFERENCES products(id),
UNIQUE KEY (order_id, product_id)
);
-- PostgreSQL with UUID
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(255) NOT NULL UNIQUE,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- JSON column (PostgreSQL)
CREATE TABLE settings (
id SERIAL PRIMARY KEY,
user_id INT NOT NULL REFERENCES users(id),
preferences JSONB NOT NULL DEFAULT '{}'::jsonb,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Enum type (PostgreSQL)
CREATE TYPE user_role AS ENUM ('admin', 'user', 'guest');
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL,
role user_role NOT NULL DEFAULT 'user'
);
-- Table with CHECK constraint
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
price DECIMAL(10, 2) NOT NULL,
discount_percent INT DEFAULT 0,
CHECK (price > 0),
CHECK (discount_percent BETWEEN 0 AND 100)
);
-- Composite primary key
CREATE TABLE user_permissions (
user_id INT NOT NULL,
permission_id INT NOT NULL,
granted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (user_id, permission_id),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (permission_id) REFERENCES permissions(id) ON DELETE CASCADE
);
-- Self-referencing foreign key
CREATE TABLE employees (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
manager_id INT,
FOREIGN KEY (manager_id) REFERENCES employees(id)
);
-- Alter table (add column)
ALTER TABLE users
ADD COLUMN phone VARCHAR(20);
-- Alter table (modify column)
ALTER TABLE users
MODIFY COLUMN email VARCHAR(320) NOT NULL;
-- Alter table (add foreign key)
ALTER TABLE orders
ADD CONSTRAINT fk_user
FOREIGN KEY (user_id) REFERENCES users(id);
-- Drop table
DROP TABLE IF EXISTS temp_table;
-- Create table from query
CREATE TABLE archived_orders AS
SELECT * FROM orders WHERE created_at < '2023-01-01';💡 Tips
- Use appropriate data types for efficiency
- Add NOT NULL for required fields
- Use AUTO_INCREMENT/SERIAL for primary keys
- Add foreign keys for referential integrity
- Use UNIQUE constraints where appropriate
- Add indexes on foreign keys
- Use DEFAULT for common values
- Include created_at/updated_at timestamps
- Consider soft deletes (deleted_at column)
- Normalize data to avoid redundancy
⚠️ Common Pitfalls
- VARCHAR too short causes truncation
- Missing foreign key constraints allows orphaned data
- No primary key makes updates difficult
- Over-normalization complicates queries
- Wrong data types waste space
- Missing indexes on foreign keys is slow
- Circular foreign key dependencies
- ON DELETE CASCADE can delete too much