-- ============================================================ -- DEALERS CSV IMPORT - WORKING SOLUTION -- ============================================================ -- This script provides a working solution for importing dealers -- from CSV with auto-generated columns (dealer_id, created_at, updated_at, is_active) -- ============================================================ -- METHOD 1: If your CSV does NOT have dealer_id, created_at, updated_at, is_active -- ============================================================ -- Use this COPY command if your CSV has exactly 44 columns (without the auto-generated ones) \copy public.dealers( sales_code, service_code, gear_code, gma_code, region, dealership, state, district, city, location, city_category_pst, layout_format, tier_city_category, on_boarding_charges, date, single_format_month_year, domain_id, replacement, termination_resignation_status, date_of_termination_resignation, last_date_of_operations, old_codes, branch_details, dealer_principal_name, dealer_principal_email_id, dp_contact_number, dp_contacts, showroom_address, showroom_pincode, workshop_address, workshop_pincode, location_district, state_workshop, no_of_studios, website_update, gst, pan, firm_type, prop_managing_partners_directors, total_prop_partners_directors, docs_folder_link, workshop_gma_codes, existing_new, dlrcode ) FROM 'C:/Users/COMP/Downloads/DEALERS_CLEAN.csv' WITH ( FORMAT csv, HEADER true, ENCODING 'UTF8' ); -- ============================================================ -- METHOD 2: If your CSV HAS dealer_id, created_at, updated_at, is_active columns -- ============================================================ -- Use this approach if your CSV has 48 columns (including the auto-generated ones) -- This creates a temporary table, imports, then inserts with defaults -- Step 1: Create temporary table matching your CSV structure -- This accepts ALL columns from CSV (whether 44 or 48 columns) CREATE TEMP TABLE dealers_temp ( dealer_id TEXT, sales_code TEXT, service_code TEXT, gear_code TEXT, gma_code TEXT, region TEXT, dealership TEXT, state TEXT, district TEXT, city TEXT, location TEXT, city_category_pst TEXT, layout_format TEXT, tier_city_category TEXT, on_boarding_charges TEXT, date TEXT, single_format_month_year TEXT, domain_id TEXT, replacement TEXT, termination_resignation_status TEXT, date_of_termination_resignation TEXT, last_date_of_operations TEXT, old_codes TEXT, branch_details TEXT, dealer_principal_name TEXT, dealer_principal_email_id TEXT, dp_contact_number TEXT, dp_contacts TEXT, showroom_address TEXT, showroom_pincode TEXT, workshop_address TEXT, workshop_pincode TEXT, location_district TEXT, state_workshop TEXT, no_of_studios TEXT, website_update TEXT, gst TEXT, pan TEXT, firm_type TEXT, prop_managing_partners_directors TEXT, total_prop_partners_directors TEXT, docs_folder_link TEXT, workshop_gma_codes TEXT, existing_new TEXT, dlrcode TEXT, created_at TEXT, updated_at TEXT, is_active TEXT ); -- Step 2: Import CSV into temporary table -- This will work whether your CSV has 44 or 48 columns \copy dealers_temp FROM 'C:/Users/COMP/Downloads/DEALERS_CLEAN.csv' WITH (FORMAT csv, HEADER true, ENCODING 'UTF8'); -- Optional: Check what was imported -- SELECT COUNT(*) FROM dealers_temp; -- Step 3: Insert into actual dealers table -- IMPORTANT: We IGNORE dealer_id, created_at, updated_at, is_active from CSV -- These will use database DEFAULT values (auto-generated UUID, current timestamp, true) INSERT INTO public.dealers ( sales_code, service_code, gear_code, gma_code, region, dealership, state, district, city, location, city_category_pst, layout_format, tier_city_category, on_boarding_charges, date, single_format_month_year, domain_id, replacement, termination_resignation_status, date_of_termination_resignation, last_date_of_operations, old_codes, branch_details, dealer_principal_name, dealer_principal_email_id, dp_contact_number, dp_contacts, showroom_address, showroom_pincode, workshop_address, workshop_pincode, location_district, state_workshop, no_of_studios, website_update, gst, pan, firm_type, prop_managing_partners_directors, total_prop_partners_directors, docs_folder_link, workshop_gma_codes, existing_new, dlrcode ) SELECT NULLIF(sales_code, ''), NULLIF(service_code, ''), NULLIF(gear_code, ''), NULLIF(gma_code, ''), NULLIF(region, ''), NULLIF(dealership, ''), NULLIF(state, ''), NULLIF(district, ''), NULLIF(city, ''), NULLIF(location, ''), NULLIF(city_category_pst, ''), NULLIF(layout_format, ''), NULLIF(tier_city_category, ''), NULLIF(on_boarding_charges, ''), NULLIF(date, ''), NULLIF(single_format_month_year, ''), NULLIF(domain_id, ''), NULLIF(replacement, ''), NULLIF(termination_resignation_status, ''), NULLIF(date_of_termination_resignation, ''), NULLIF(last_date_of_operations, ''), NULLIF(old_codes, ''), NULLIF(branch_details, ''), NULLIF(dealer_principal_name, ''), NULLIF(dealer_principal_email_id, ''), NULLIF(dp_contact_number, ''), NULLIF(dp_contacts, ''), NULLIF(showroom_address, ''), NULLIF(showroom_pincode, ''), NULLIF(workshop_address, ''), NULLIF(workshop_pincode, ''), NULLIF(location_district, ''), NULLIF(state_workshop, ''), CASE WHEN no_of_studios = '' THEN 0 ELSE no_of_studios::INTEGER END, NULLIF(website_update, ''), NULLIF(gst, ''), NULLIF(pan, ''), NULLIF(firm_type, ''), NULLIF(prop_managing_partners_directors, ''), NULLIF(total_prop_partners_directors, ''), NULLIF(docs_folder_link, ''), NULLIF(workshop_gma_codes, ''), NULLIF(existing_new, ''), NULLIF(dlrcode, '') FROM dealers_temp; -- Step 4: Clean up temporary table DROP TABLE dealers_temp; -- ============================================================ -- METHOD 3: Using COPY with DEFAULT (PostgreSQL 12+) -- ============================================================ -- Alternative approach using a function to set defaults -- Create a function to handle the import with defaults CREATE OR REPLACE FUNCTION import_dealers_from_csv() RETURNS void AS $$ BEGIN -- This will be called from a COPY command that uses a function -- See METHOD 1 for the actual COPY command END; $$ LANGUAGE plpgsql; -- ============================================================ -- VERIFICATION QUERIES -- ============================================================ -- Check import results SELECT COUNT(*) as total_dealers, COUNT(dealer_id) as has_dealer_id, COUNT(created_at) as has_created_at, COUNT(updated_at) as has_updated_at, COUNT(*) FILTER (WHERE is_active = true) as active_count FROM dealers; -- View sample records with auto-generated values SELECT dealer_id, dlrcode, dealership, created_at, updated_at, is_active FROM dealers LIMIT 5; -- Check for any issues SELECT COUNT(*) FILTER (WHERE dealer_id IS NULL) as missing_dealer_id, COUNT(*) FILTER (WHERE created_at IS NULL) as missing_created_at, COUNT(*) FILTER (WHERE updated_at IS NULL) as missing_updated_at FROM dealers;