sql >> データベース >  >> RDS >> Mysql

PHPループまたはMySQLを使用した不良データベースの再構築

    PHPは必要ありません。純粋なMySQLコードでのみ実行できます。

    テーブルの作成/テーブルの挿入

    CREATE TABLE HugeTable
        (`Column1` VARCHAR(11), `Column2` VARCHAR(11), `Column3` VARCHAR(11))
    ;
    
    INSERT INTO HugeTable
        (`Column1`, `Column2`, `Column3`)
    VALUES
        ('Data1;Data2', 'Data3;Data4', 'Data5;Data6')
    ; 
    
    CREATE TABLE NewTable
       (`Column1` VARCHAR(11), `Column2` VARCHAR(11), `Column3` VARCHAR(11))
    ;
    

    まず、MySQLで数値を生成する必要があります。このMySQLコードは、1から100を生成します。したがって、最終的なクエリは、最大100個の個別の値をサポートします。

    クエリ

    SELECT 
     @row := @row + 1 AS ROW
    FROM (
      SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
    ) row1
    CROSS JOIN (
      SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
    ) row2
    CROSS JOIN (
      SELECT @row := 0 
    ) init_user_params 
    

    結果

      row  
    --------
           1
           2
           3
           4
           5
           6
           7
           8
           9
          10
         ...
         ...
          90
          91
          92
          93
          94
          95
          96
          97
          98
          99
         100
    

    これで、;で分離する方法を見ることができます。区切り文字。ネストされたSUBSTRING_INDEX関数をそのために使用できます

    クエリ

    SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('Data1;Data2', ';', 1), ';', -1) AS DATA
    

    結果

    data    
    --------
    Data1   
    

    使用できる2番目の単語が必要な場合は、最初の単語のみが返されることがわかります。

    クエリ

    SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('Data1;Data2', ';', 2), ';', -1) AS DATA
    

    結果

    data    
    --------
    Data2  
    

    次に、数値ジェネレーターとSUBSTRING_INDEXを組み合わせて、データを生成します

    クエリ

    SELECT 
      DISTINCT
       SUBSTRING_INDEX(SUBSTRING_INDEX(Column1, ';', rows.row), ';', -1) Column1
     , SUBSTRING_INDEX(SUBSTRING_INDEX(Column2, ';', rows.row), ';', -1) Column2
     , SUBSTRING_INDEX(SUBSTRING_INDEX(Column3, ';', rows.row), ';', -1) Column3
    FROM (
      SELECT 
       @row := @row + 1 AS ROW
      FROM (
        SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
      ) row1
      CROSS JOIN (
        SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
      ) row2  
      CROSS JOIN (
        SELECT @row := 0 
      ) init_user_params
    )
     ROWS
    CROSS JOIN 
     HugeTable 
    

    結果

    Column1  Column2  Column3  
    -------  -------  ---------
    Data1    Data3    Data5    
    Data2    Data4    Data6   
    

    クエリNewTable

    INSERT INTO 
      NewTable
    SELECT 
      DISTINCT
       SUBSTRING_INDEX(SUBSTRING_INDEX(Column1, ';', rows.row), ';', -1) Column1
     , SUBSTRING_INDEX(SUBSTRING_INDEX(Column2, ';', rows.row), ';', -1) Column2
     , SUBSTRING_INDEX(SUBSTRING_INDEX(Column3, ';', rows.row), ';', -1) Column3
    FROM (
      SELECT 
       @row := @row + 1 AS ROW
      FROM (
        SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
      ) row1
      CROSS JOIN (
        SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
      ) row2  
      CROSS JOIN (
        SELECT @row := 0 
      ) init_user_params
    )
     ROWS
    CROSS JOIN 
     HugeTable 
    

    クエリ

    SELECT * FROM NewTable
    

    結果

    Column1  Column2  Column3  
    -------  -------  ---------
    Data1    Data3    Data5    
    Data2    Data4    Data6   
    



    1. phpを使用したutf-8のoracleからのデータ

    2. 2020.24でのデータコネクタの変更

    3. 手動でDBを更新した後、Hibernateの第2レベルのキャッシュをクリアします

    4. MySQL接続がまだ生きているかどうかを判断するための最も安価な方法