text: # tested under MySQL v.8.0.22
  
  CREATE TABLE TRAMWAJ AS
      SELECT DISTINCT
             SUBSTRING_INDEX(MarkaTramwaju, ',', 1) AS NAZWA,
             CAST(SUBSTRING(SUBSTRING_INDEX(SUBSTRING_INDEX(MarkaTramwaju, ',', 2), ',', -1) FROM 16) AS UNSIGNED) AS WEJSCIA,
             CAST(SUBSTRING(SUBSTRING_INDEX(SUBSTRING_INDEX(MarkaTramwaju, ',', -2), ',', 1) FROM 20) AS UNSIGNED) AS PRZEGUBY,
             TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(MarkaTramwaju, ',', -1), ':', -1)) AS NISKOPODLOGOWY
      FROM MPK;
  
  ALTER TABLE TRAMWAJ MODIFY NAZWA VARCHAR(30);
  ALTER TABLE TRAMWAJ MODIFY WEJSCIA TINYINT;
  ALTER TABLE TRAMWAJ MODIFY PRZEGUBY TINYINT;
  ALTER TABLE TRAMWAJ MODIFY NISKOPODLOGOWY CHAR(3);
  ALTER TABLE TRAMWAJ ADD PRIMARY KEY (NAZWA);
  
  CREATE TEMPORARY TABLE NAZWA_PRZYSTANKU1 AS
      SELECT DISTINCT
          SUBSTRING_INDEX(PrzystanekPoczatkowyPetla, ',', 1) NAZWA,
          ROW_NUMBER() over (ORDER BY PrzystanekPoczatkowyPetla) ROW_NUM
      FROM MPK;
  
  CREATE TEMPORARY TABLE PRZEPUSTOWOSC1 AS
      SELECT DISTINCT CAST(SUBSTRING(SUBSTRING_INDEX(PrzystanekPoczatkowyPetla, ',', -1) FROM 17) AS SIGNED)
          AS PRZEPUSTOWOSC,
          row_number() over (ORDER BY PrzystanekPoczatkowyPetla) AS ROW_NUM
      FROM MPK;
  
  CREATE TEMPORARY TABLE ADRES1 AS
      SELECT DISTINCT SUBSTRING_INDEX(ADRES_TMP, ',', -1) AS ADRES, ROW_NUM  FROM
          (SELECT SUBSTRING_INDEX(PrzystanekPoczatkowyPetla, ',', 2) AS ADRES_TMP,
                  row_number() over (ORDER BY PrzystanekPoczatkowyPetla) AS ROW_NUM FROM MPK) AS TMP;
  
  
  CREATE TEMPORARY TABLE OTWARCIE1 AS
      SELECT DISTINCT STR_TO_DATE(SUBSTRING(SUBSTRING_INDEX(OTWARCIE_TMP, ',', 1) FROM 12), '%d.%m.%Y') AS OTWARCIE, ROW_NUM FROM
          (SELECT SUBSTRING_INDEX(PrzystanekPoczatkowyPetla, ',', -2) AS OTWARCIE_TMP,
                  row_number() over (ORDER BY PrzystanekPoczatkowyPetla) AS ROW_NUM FROM MPK) AS TMP;
  
  CREATE TABLE PRZYSTANKI1 AS
      SELECT DISTINCT NAZWA, ADRES, OTWARCIE, PRZEPUSTOWOSC FROM
          NAZWA_PRZYSTANKU1
          JOIN ADRES1 A on NAZWA_PRZYSTANKU1.ROW_NUM = A.ROW_NUM
          JOIN OTWARCIE1 O on A.ROW_NUM = O.ROW_NUM
          JOIN PRZEPUSTOWOSC1 P on O.ROW_NUM = P.ROW_NUM;
  
  CREATE TEMPORARY TABLE NAZWA_PRZYSTANKU2 AS
      SELECT DISTINCT
          SUBSTRING_INDEX(PrzystankeKoncowyPetla, ',', 1) NAZWA,
          ROW_NUMBER() over (ORDER BY PrzystankeKoncowyPetla) ROW_NUM
      FROM MPK;
  
  CREATE TEMPORARY TABLE PRZEPUSTOWOSC2 AS
      SELECT DISTINCT CAST(SUBSTRING(SUBSTRING_INDEX(PrzystankeKoncowyPetla, ',', -1) FROM 17) AS SIGNED)
          AS PRZEPUSTOWOSC,
          row_number() over (ORDER BY PrzystankeKoncowyPetla) AS ROW_NUM
      FROM MPK;
  
  CREATE TEMPORARY TABLE ADRES2 AS
      SELECT DISTINCT SUBSTRING_INDEX(ADRES_TMP, ',', -1) AS ADRES, ROW_NUM  FROM
          (SELECT SUBSTRING_INDEX(PrzystankeKoncowyPetla, ',', 2) AS ADRES_TMP,
                  row_number() over (ORDER BY PrzystankeKoncowyPetla) AS ROW_NUM FROM MPK) AS TMP;
  
  
  CREATE TEMPORARY TABLE OTWARCIE2 AS
      SELECT DISTINCT STR_TO_DATE(SUBSTRING(SUBSTRING_INDEX(OTWARCIE_TMP, ',', 1) FROM 12), '%d.%m.%Y') AS OTWARCIE, ROW_NUM FROM
          (SELECT SUBSTRING_INDEX(PrzystankeKoncowyPetla, ',', -2) AS OTWARCIE_TMP,
                  row_number() over (ORDER BY PrzystankeKoncowyPetla) AS ROW_NUM FROM MPK) AS TMP;
  
  CREATE TABLE PRZYSTANKI2 AS
      SELECT DISTINCT NAZWA, ADRES, OTWARCIE, PRZEPUSTOWOSC FROM
          NAZWA_PRZYSTANKU2
          JOIN ADRES2 A on NAZWA_PRZYSTANKU2.ROW_NUM = A.ROW_NUM
          JOIN OTWARCIE2 O on A.ROW_NUM = O.ROW_NUM
          JOIN PRZEPUSTOWOSC2 P on O.ROW_NUM = P.ROW_NUM;
  
  CREATE TABLE PRZYSTANKI AS
      SELECT * FROM PRZYSTANKI1
      UNION
      SELECT * FROM PRZYSTANKI2;
  
  ALTER TABLE PRZYSTANKI MODIFY NAZWA VARCHAR(30);
  ALTER TABLE PRZYSTANKI MODIFY ADRES VARCHAR(30);
  ALTER TABLE PRZYSTANKI MODIFY PRZEPUSTOWOSC TINYINT;
  ALTER TABLE PRZYSTANKI ADD PRIMARY KEY (NAZWA);
  
  CREATE TABLE LINIE AS
      SELECT CAST(SUBSTRING_INDEX(NumerLiniITyp, ',', 1) AS UNSIGNED) AS NUMER_LINI,
             TRIM(SUBSTRING_INDEX(NumerLiniITyp, ',', -1)) AS TYP_LINI,
             SUBSTRING_INDEX(PrzystanekPoczatkowyPetla, ',', 1) AS PRZYSTANEK_POCZATKOWY,
             SUBSTRING_INDEX(PrzystankeKoncowyPetla, ',', 1) AS PRZYSTANEK_KONCOWY,
             LiczbaPrzystankow AS LICZBA_PRZYSTANKOW,
             SUBSTRING_INDEX(MarkaTramwaju, ',', 1) AS MODEL_TRAMWAJU
      FROM MPK;
  
  ALTER TABLE LINIE MODIFY NUMER_LINI TINYINT;
  ALTER TABLE LINIE MODIFY PRZYSTANEK_POCZATKOWY VARCHAR(30);
  ALTER TABLE LINIE MODIFY PRZYSTANEK_KONCOWY VARCHAR(30);
  ALTER TABLE LINIE MODIFY MODEL_TRAMWAJU VARCHAR(30);
  ALTER TABLE LINIE ADD PRIMARY KEY (NUMER_LINI);
  ALTER TABLE LINIE ADD CONSTRAINT przystanke_poczatkowy_fk FOREIGN KEY (PRZYSTANEK_POCZATKOWY) REFERENCES PRZYSTANKI(NAZWA);
  ALTER TABLE LINIE ADD CONSTRAINT przystanek_koncowy_fk FOREIGN KEY (PRZYSTANEK_KONCOWY) REFERENCES PRZYSTANKI(NAZWA);
  ALTER TABLE LINIE ADD CONSTRAINT model_tramwaju_fk FOREIGN KEY (MODEL_TRAMWAJU) REFERENCES TRAMWAJ(NAZWA);
  
  CREATE TEMPORARY TABLE MPK_TMP AS
      SELECT MPK.*, SUBSTRING_INDEX(OsobyKierujace, ';', 1) AS KIEROWCA
          FROM MPK
      UNION
      SELECT
          MPK.*, SUBSTRING_INDEX(OsobyKierujace, ';', -1) AS KIEROWCA
          FROM MPK;
  
  CREATE TABLE KIEROWCY
  WITH IMIE_NAZWISKO AS
      (SELECT SUBSTRING_INDEX(TRIM(KIEROWCA), ' ', 2) AS IM,
              KIEROWCA, NumerLiniITyp
          FROM MPK_TMP)
  SELECT TRIM(SUBSTRING(REGEXP_SUBSTR(KIEROWCA, "(ID: K[0-9][0-9][0-9])") FROM 4)) AS ID,
         SUBSTRING_INDEX(IM, ' ', -1) AS NAZWISKO,
         SUBSTRING_INDEX(IM, ' ', 1) AS IMIE,
         STR_TO_DATE(REGEXP_SUBSTR(KIEROWCA, "[0-9]{2}[.]{1}[0-9]{2}[.]{1}[0-9]{4}"), '%d.%m.%Y') AS PRAWO_JAZDY,
         CAST(SUBSTRING_INDEX(REGEXP_SUBSTR(KIEROWCA, "zarobki: [0-9]{4}"), ' ', -1) AS UNSIGNED) AS ZAROBKI,
         TRIM(SUBSTRING_INDEX(KIEROWCA, ':', -1)) AS STANOWISKO,
         CAST(SUBSTRING_INDEX(NumerLiniITyp, ',', 1) AS UNSIGNED) AS NUMER_LINI
      FROM IMIE_NAZWISKO;
  
  
  ALTER TABLE KIEROWCY MODIFY ID CHAR(4);
  ALTER TABLE KIEROWCY MODIFY NAZWISKO VARCHAR(24);
  ALTER TABLE KIEROWCY MODIFY IMIE VARCHAR(24);
  ALTER TABLE KIEROWCY MODIFY ZAROBKI NUMERIC(6, 2);
  ALTER TABLE KIEROWCY MODIFY STANOWISKO VARCHAR(24);
  ALTER TABLE KIEROWCY MODIFY NUMER_LINI TINYINT;
  ALTER TABLE KIEROWCY ADD PRIMARY KEY (ID);
  ALTER TABLE KIEROWCY ADD CONSTRAINT kierowcy_fk FOREIGN KEY (NUMER_LINI) REFERENCES LINIE(NUMER_LINI);
  