51 lines
1.7 KiB
PL/PgSQL
Executable File
51 lines
1.7 KiB
PL/PgSQL
Executable File
-- Create Users table
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id SERIAL PRIMARY KEY,
|
|
name VARCHAR(100) NOT NULL,
|
|
email VARCHAR(120) UNIQUE NOT NULL,
|
|
age INTEGER NOT NULL,
|
|
location VARCHAR(100) NOT NULL,
|
|
gender VARCHAR(10) NOT NULL,
|
|
password_hash VARCHAR(128) NOT NULL,
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Create Messages table
|
|
CREATE TABLE IF NOT EXISTS messages (
|
|
id SERIAL PRIMARY KEY,
|
|
sender_id INTEGER NOT NULL REFERENCES users(id),
|
|
receiver_id INTEGER NOT NULL REFERENCES users(id),
|
|
content VARCHAR(500) NOT NULL,
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Create index for faster queries on location
|
|
CREATE INDEX IF NOT EXISTS idx_users_location ON users(location);
|
|
|
|
-- Create indexes for faster message retrieval
|
|
CREATE INDEX IF NOT EXISTS idx_messages_sender ON messages(sender_id);
|
|
CREATE INDEX IF NOT EXISTS idx_messages_receiver ON messages(receiver_id);
|
|
|
|
-- Function to update the updated_at column
|
|
CREATE OR REPLACE FUNCTION update_updated_at_column()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
NEW.updated_at = CURRENT_TIMESTAMP;
|
|
RETURN NEW;
|
|
END;
|
|
$$ language 'plpgsql';
|
|
|
|
-- Drop the trigger if it already exists to avoid conflicts
|
|
DROP TRIGGER IF EXISTS update_users_updated_at ON users;
|
|
|
|
-- Create trigger to automatically update the updated_at column
|
|
CREATE TRIGGER update_users_updated_at
|
|
BEFORE UPDATE ON users
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION update_updated_at_column();
|
|
|
|
-- Grant necessary permissions to workout_user
|
|
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO workout_user;
|
|
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO workout_user;
|