2020-09-28 brew invalid 'depends_on macos' / MySQL Unique KeyのNULLの扱い / MySQL Generated index
invalid ‘depends_on macos’ value: “>= :leopard”
下記エラーの対処方法について
$ brew uninstall sequel-pro
Error: Cask 'sequel-pro' definition is invalid: invalid 'depends_on macos' value: ">= :leopard"
以下のエラーで削除も更新も出来ない場合
Error: Cask 'eclipse-jee' definition is invalid: invalid 'depends_on macos' value: ":leopard"
以下を実行する
/usr/bin/find "$(brew --prefix)/Caskroom/"*'/.metadata' -type f -name '*.rb' -print0 | /usr/bin/xargs -0 /usr/bin/sed -i '' '/depends_on > macos:/d'
MySQL Unique Key の NULL の扱い
論理削除カラムと一緒にUnique Key 設定しても論理削除カラムがNULLだとUniqueにはならないよ、という話。
mysql> create unique index idx ON users(email, deleted_at);
mysql> select * from users;
+------+-------+---------------------+
| id | email | deleted_at |
+------+-------+---------------------+
| 1 | x | NULL |
| 1 | x | NULL |
| 1 | x | 2020-09-25 00:00:00 |
+------+-------+---------------------+
MySQL Generated indexで(エセ)部分Index
Postgresの部分INDEX
部分Indexを使ってユニーク制約をかける例
CREATE UNIQUE INDEX uidx_email ON account(email) WHERE del_flg = 0;
MySQLの場合
MySQL5.7以降、MySQLでGenerated columnを使えるようになりました。 これは、SQLによる演算結果をカラムとして見せる手法です。 まが、このGenerated columnにはindexを追加することができます。
MySQL5.7以降で条件付きのユニーク制約をかけるためのベストプラクティス - Qiita
mysql> CREATE TABLE IF NOT EXISTS account (
-> id bigint(20) NOT NULL AUTO_INCREMENT,
-> email varchar(255) DEFAULT NULL,
-> create_timestamp timestamp NULL DEFAULT NULL,
-> update_timestamp timestamp NULL DEFAULT NULL,
-> del_flg bool NOT NULL,
-> active_email varchar(255) GENERATED ALWAYS AS ((case when (del_flg = 0) then email else NULL end)) VIRTUAL,
-> PRIMARY KEY (id),
-> UNIQUE KEY uidx_active_email (active_email)
-> );
Query OK, 0 rows affected (0.04 sec)
active_email
を仮想的なカラムとして設定し、それにINDEXを仕掛ける手法。