mysql数据库用一个字段表示多个状态

在实际的开发中,建数据库表的有可能会因为最初的表设计不能满足所用,为了标记某种状态需要重新增加字段,但是数据库中如果有几百万条真实的数据,往往改变表结构是很危险的操作

有没有办法用一个字段表示多个状态,但是每个状态不会互相干扰呢?

此时我们可以用到位操作
如果是表示删除可以用1,未删除用0(第一位)
如果是表示上架可以用1,未上架用0(第二位)
如果是表示默认可以用1,非默认用0(第三位)

把这些状态整合起来就是000,001,010…

这时候我们只需要判断第一位是1还是0就知道是不是删除状态了,如删除状态:0 0 1,0 1 1,1 0 1,1 1 1。不管其他位是什么都不会干扰到删除位

在数据库中我用int flag字段表示多个状态

上代码:

public class test {
    private static int shiftFlag(Boolean isWhat, int bit, int flag){
        if(isWhat){
            /**
             * 如果是某状态,如:
             * 是删除状态,删除位是 bit = 001,在或操作下,一定是会让当前位 置1
             */
            flag |= bit;
        }else {
            /**
             * 如果是非某状态,如:
             * 非删除状态,删除位是 bit = 001,~会把1变成0,0变成1,所以~bit = 110,
             * 在与操作下,一定会让当前位 置0
             */
            flag &= ~bit;
        }
        return flag;
    }
    public static void main(String[] args) throws Exception {
        int flag = 0;
        final int DELETE = 0x1;				        //001 代表删除
        final int ON_SHELF = 0x2;				    //010 代表上架
        final int DEFAULT = 0x4;				    //100 代表默认

        Boolean is_delete = true;
        flag = shiftFlag(is_delete, DELETE, flag);
        System.out.print("代表删除的flag:");
        System.out.println(Integer.toBinaryString(flag));        //001

        Boolean isOnShelf = true;
        flag = shiftFlag(isOnShelf, ON_SHELF, flag);
        System.out.print("代表上架的flag:");
        System.out.println(Integer.toBinaryString(flag));        //011

        Boolean isDefault = true;
        flag = shiftFlag(isDefault, DEFAULT, flag);
        System.out.print("代表默认的flag:");
        System.out.println(Integer.toBinaryString(flag));        //111

        //此时flag是111,如果此时不是删除
        flag = shiftFlag(!is_delete, DELETE, flag);
        System.out.print("代表非删除的flag:");
        System.out.println(Integer.toBinaryString(flag));        //110

        //此时flag是110,如果此时非默认
        flag = shiftFlag(!isDefault, DEFAULT, flag);
        System.out.print("代表非默认的flag:");
        System.out.println(Integer.toBinaryString(flag));        //010
    }
}

运行结果

代表删除的flag:1
代表上架的flag:11
代表默认的flag:111
代表非删除的flag:110
代表非默认的flag:10
如果多个状态用1和0表示不了呢

如果要增加的字段是String类型的,比如增加了name字段

此时在建表的时候要预留一个text content来存字符串

        Map<String, Object> map = new HashMap<String, Object>();
        map.put("sex", "女");
        map.put("age", "18");
        map.put("name", "妞妞");
        String s = JSONObject.toJSONString(map);
        //这个就是要存在content里面的字符串
        //{"sex":"女","name":"妞妞","age":"18"}
        System.out.println(s);
        //要用的时候取出来转回map
        map = JSONObject.parseObject(s, Map.class);

问题解决,收工

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值