我有一张加密账户绑定表,其中有user_id,encrypt_account两个字段,分别表示用户id跟加密账户,某个用户跟某个加密账户绑定的时候会插入数据。
现在需要保证一个加密账户智能绑定一个用户。
很容易就想到给encrypt_account字段添加唯一索引。
但是表里还有个逻辑删除字段del,1表示已删除,0表示未删除,我只想要未删除的数据中encrypt_account唯一,而已删除的数据中encrypt_account是可以重复的。这样的话加唯一索引就没法满足了。
后来问了Ai,了解到MySQL支持生成列,生成列是一种特殊的列类型,它的值是基于其他列的值通过表达式计算得到的。
可以通过encrypt_account跟del两个字段生产一个新的字段unique_account,生成规则为当del为0时,unique_account=encrypt_account,del为其他值时,unique_account不变,也就是null。然后在unique_account上加唯一索引。这样就保证了当del为0时,encrypt_account是唯一的。
sql如下:
1.创建生成列
ALTER TABLE user_encrypt
ADD COLUMN unique_account VARCHAR(255) GENERATED ALWAYS AS (
CASE WHEN del = 0 THEN encrypt_account ELSE NULL END
) STORED;
2.创建唯一索引
CREATE UNIQUE INDEX idx_unique_account ON user_enctypt (unique_account);