43 lines
1.2 KiB
MySQL
43 lines
1.2 KiB
MySQL
|
|
-- Migration: Add slug field to clients table
|
||
|
|
-- Description: Adds a unique slug field to the clients table for URL-friendly client identification
|
||
|
|
|
||
|
|
ALTER TABLE clients
|
||
|
|
ADD COLUMN slug VARCHAR(255);
|
||
|
|
|
||
|
|
-- Add unique index on slug field
|
||
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_clients_slug ON clients(slug);
|
||
|
|
|
||
|
|
-- Add comment
|
||
|
|
COMMENT ON COLUMN clients.slug IS 'URL-friendly slug generated from client name';
|
||
|
|
|
||
|
|
-- Update existing records with slugs based on their names
|
||
|
|
-- Note: This will generate slugs for existing clients
|
||
|
|
UPDATE clients
|
||
|
|
SET slug = LOWER(
|
||
|
|
REGEXP_REPLACE(
|
||
|
|
REGEXP_REPLACE(name, '[^a-zA-Z0-9\s-]', '', 'g'),
|
||
|
|
'\s+', '-', 'g'
|
||
|
|
)
|
||
|
|
)
|
||
|
|
WHERE slug IS NULL OR slug = '';
|
||
|
|
|
||
|
|
-- Handle potential duplicates by appending numbers
|
||
|
|
WITH numbered_slugs AS (
|
||
|
|
SELECT
|
||
|
|
id,
|
||
|
|
slug,
|
||
|
|
ROW_NUMBER() OVER (PARTITION BY slug ORDER BY created_at) as rn
|
||
|
|
FROM clients
|
||
|
|
WHERE slug IS NOT NULL
|
||
|
|
)
|
||
|
|
UPDATE clients
|
||
|
|
SET slug = CASE
|
||
|
|
WHEN ns.rn > 1 THEN ns.slug || '-' || ns.rn
|
||
|
|
ELSE ns.slug
|
||
|
|
END
|
||
|
|
FROM numbered_slugs ns
|
||
|
|
WHERE clients.id = ns.id AND ns.rn > 1;
|
||
|
|
|
||
|
|
-- Make slug field NOT NULL after populating existing data
|
||
|
|
ALTER TABLE clients ALTER COLUMN slug SET NOT NULL;
|