36 lines
1020 B
PL/PgSQL
36 lines
1020 B
PL/PgSQL
-- Migration: 002_sequence_by_name
|
|
-- Adds a sequence table that uses schema name instead of UUID for simpler operation
|
|
|
|
BEGIN;
|
|
|
|
-- Create a simpler sequences table using schema name
|
|
CREATE TABLE IF NOT EXISTS sequences_by_name (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
schema_name TEXT NOT NULL,
|
|
scope TEXT NOT NULL,
|
|
current_value INTEGER NOT NULL DEFAULT 0,
|
|
UNIQUE(schema_name, scope)
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_sequences_by_name ON sequences_by_name(schema_name, scope);
|
|
|
|
-- Function to get next sequence by schema name
|
|
CREATE OR REPLACE FUNCTION next_sequence_by_name(
|
|
p_schema_name TEXT,
|
|
p_scope TEXT
|
|
) RETURNS INTEGER AS $$
|
|
DECLARE
|
|
v_next INTEGER;
|
|
BEGIN
|
|
INSERT INTO sequences_by_name (schema_name, scope, current_value)
|
|
VALUES (p_schema_name, p_scope, 1)
|
|
ON CONFLICT (schema_name, scope) DO UPDATE
|
|
SET current_value = sequences_by_name.current_value + 1
|
|
RETURNING current_value INTO v_next;
|
|
|
|
RETURN v_next;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
COMMIT;
|