首页 > 数据库 >mysql在索引定义中直接使用条件语句

mysql在索引定义中直接使用条件语句

时间:2023-08-12 23:57:36浏览次数:42  
标签:语句 status ci COMMENT utf8 索引 COLLATE unicode mysql

原始数据库表如下:

CREATE TABLE `events` (
`id`int(11) unsigned NOT NULL AUTO_INCREMENT,
`status` enum('on','off') COLLATE utf8_unicode_ci NOT NULL COMMENT '开关状态',
`type` enum('gas_fee_free') COLLATE utf8_unicode_ci NOT NULLDEFAULT'gas_fee_free' COMMENT '类型:',
`scope` enum('global','space','badge') COLLATE utf8_unicode_ci NOT NULLDEFAULT'global' COMMENT '范围',
PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='时间活动表';
想实现的效果是 在特定的type和scope情况下,on的个数只能有一个,off的个数可以是多个,因为活动同时只能有一个开启。   但是如果直接把他们3加索引:
UNIQUEKEY`type_scope_index` (`type`,`scope`,`status`) USING BTREE,
那么on和off各只能有一个,不符合需求;  

使用虚拟列(virtual column)来实现这样的条件唯一性约束。以下是修改后的创建表语句:

CREATE TABLE `events` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `status` enum('on','off') COLLATE utf8_unicode_ci NOT NULL COMMENT '开关状态',
  `type` enum('gas_fee_free') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'gas_fee_free' COMMENT '类型:',
  `scope` enum('global','space','badge') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'global' COMMENT '范围',
  `status_on` enum('on') COLLATE utf8_unicode_ci AS (CASE WHEN (`status` = 'on') THEN 'on' END) VIRTUAL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `type_scope_status_on_unique` (`type`,`scope`,`status_on`) USING BTREE,
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='时间活动表';

在上述语句中,我们添加了一个虚拟列 status_on,它根据 status 列的值生成一个虚拟的 status_on 列。然后,我们在唯一索引 type_scope_status_on_unique 中使用了这个虚拟列,以实现在 status 为 'on' 时的唯一性约束。

请注意,在使用虚拟列时,你需要确保你的 MySQL 版本支持此功能。这个示例假设你使用的是支持虚拟列的 MySQL 版本。

非常抱歉之前的错误带来的困扰。希望这次的回答能够解决问题。如果还有其他问题,请随时提问。

标签:语句,status,ci,COMMENT,utf8,索引,COLLATE,unicode,mysql
From: https://www.cnblogs.com/zhanchenjin/p/17625877.html

相关文章

  • mysql8默认caching_sha2_password身份验证
    发生这个问题的原因是在mysql8.0以后,caching_sha2_password是默认的身份验证插件,而不是以往的mysql_native_password。在MySQLCommandLine工具下修改mysql的默认身份验证插件即可。Theserverrequestedauthenticationmethodunknowntotheclient[caching_sha2_passw......
  • SpringBatch读取mysql数据
    1.在本地数据库创建user表建表语句:createtable`user`(`id`bigintnotnullauto_incrementcomment'主键',`name`varchar(32)defaultnullcomment'用户名',`age`intdefaultnullcomment'年龄',primarykey(id))engine=innodbde......
  • 【我和openGauss的故事】openGauss索引推荐功能测试
    _openGauss2023-07-2818:22发表于四川收录于合集#第六届openGauss技术文章征集初审合格文章62个一、单索引推荐单索引推荐功能,目前支持select查询,看官方介绍类似oracle中的sql_tunning_adviser,不过只是推荐创建索引。根据sql优化原理,猜测应该时根据选择来推荐索引。1、查看sql......
  • 2308-习题 分支循环,goto语句
    1.习题3.1.输入三个整数,从大到小输出这三个数 1#define_CRT_SECURE_NO_WARNINGS2#include<stdio.h>3intmain()4{56inta=0;7intb=0;8intc=0;9inttemp=0;10scanf("%d%d%d",&a,&b,&c);11......
  • 条件控制语句
    条件控制语句if~~else案例importjava.util.Scanner;publicclassIf{ publicstaticvoidmain(String[]args){ Scannerinput=newScanner(System.in); System.out.println("请输入你的年龄"); intage=input.nextInt(); if(age>18){ System.out.pri......
  • SpringBatch连接mysql
    1.添加依赖一个是SpringBatch依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-batch</artifactId></dependency>一个是mysql依赖<dependency><......
  • 搭建My Batis(Maven + MySql + log4j)
    前言MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJOs(PlainOrdinaryJavaObject,普通的Java对象)映......
  • 解决linux mysql命令 bash mysql command not found 的方法
    错误:root@DB-02~]#mysql-uroot-bash:mysql:commandnotfound原因:这是由于系统默认会查找/usr/bin下的命令,如果这个命令不在这个目录下,当然会找不到命令,我们需要做的就是映射一个链接到/usr/bin目录下,相当于建立一个链接文件。首先得知道mysql命令或mysqladmin命令的完整路......
  • go项目实现mysql接入以及web api
    创建go项目,并在go项目中接入mysql,将mysql的配置项单独整理放到一个胚子和文件中,支持项目启动时,通过加载配置文件中的值,然后创建数据库连接。之后使用net/http相关的库,创建路由,并在路由中通过不同的http方法,实现mysql连接的test数据库中users表的增删改查的webapi1.在ide......
  • MySQL 设置 IP 白名单
    1.登录MySQLmysql-uroot-p2.新增用户并授予权限MySQL8之前:grantallon*.*to'username'@'ip'identifiedby'password'withgrantoption;MySQL8开始:createuser'username'@'ip'identifiedwithmysql_native_pa......