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

部分インデックスまたはフィルター処理されたインデックスのmysqlでの回避策?

    フィルター処理されたインデックスは、関数インデックスとCASEでエミュレートできます。 式(MySQL 8.0.13以降):

    CREATE TABLE t(id INT PRIMARY KEY, myColumn VARCHAR(100));
    
    -- NULL are not taken into account with `UNIQUE` indexes   
    CREATE UNIQUE INDEX myIndex ON t((CASE WHEN myColumn <> 'myText' THEN myColumn END));
    
    
    -- inserting excluded value twice
    INSERT INTO t(id, myColumn) VALUES(1, 'myText'), (2, 'myText');
    
    -- trying to insert different value than excluded twice
    INSERT INTO t(id, myColumn) VALUES(3, 'aaaaa');
    
    INSERT INTO t(id, myColumn) VALUES(4, 'aaaaa');
    -- Duplicate entry 'aaaaa' for key 'myIndex'
    
    SELECT * FROM t;
    

    db<>フィドルデモ

    出力:

    +-----+----------+
    | id  | myColumn |
    +-----+----------+
    |  1  | myText   |
    |  2  | myText   |
    |  3  | aaaaa    |
    +-----+----------+
    


    1. INITCAP()–PostgreSQLで初期キャップに変換

    2. SQLServerのメッセージ8114「データ型varcharから数値への変換エラー」を修正しました

    3. MySQLdbが実行する実際のクエリを出力しますか?

    4. 週末を除く2つの日付の間の日数をカウントします(MySQLのみ)