部分インデックスまたはフィルタリングインデックスのMySQLの回避策?

StackOverflow https://stackoverflow.com/questions/7804565

質問

MySQL DBを使用しています。 PostgreSQLとSQL Serverが部分インデックスをサポートしていることを知っています。私の場合、私はこのようなことをしたいです:

CREATE UNIQUE INDEX myIndex ON myTable (myColumn) where myColumn <> 'myText'

一意の制約を作成したいのですが、特定のテキストである場合は複製を許可する必要があります。

MySQLでこれを行う直接的な方法が見つかりませんでした。しかし、それを達成するための回避策はありますか?

役に立ちましたか?

解決

それを達成する方法は1つしかないと思います。テーブルに別の列を追加し、インデックスを作成してトリガーを作成したり、ストアドプロシージャ内に挿入/更新を行い、次の条件を使用してこの列を入力します。

if value = 'myText' then put null
otherwise put value

それが役に立てば幸い

他のヒント

フィルタリングされたインデックスは、関数インデックスでエミュレートできます 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    |
+-----+----------+
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top