精华内容
下载资源
问答
  • mysql数据库一个字段表示多个状态

    千次阅读 2019-11-23 12:13:04
    在实际的开发中,建数据库表的有可能会因为最初的表设计不能满足所用,为了标记某种状态需要重新增加字段,但是数据库中如果有几百万条真实的数据,往往改变表结构是很危险的操作 有没有办法用一个字段表示多个状态...

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

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

    此时我们可以用到位操作
    如果是表示删除可以用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);
    

    问题解决,收工

    展开全文
  • android 数据库升级,增加字段,以后会更新升级增加建表
  • Mysql数据库实现一个字段关联多张表

    千次阅读 2020-02-14 13:35:45
    Mysql数据库实现一个字段关联多张表 Ps:由于我的数据库功底不是很扎实,所以如果有什么设计的不好的地方欢迎指出 我用设计数据库的时候为了看清楚就用draw.io画了个图: 关于draw.io的web端搭建,欢迎来看看我写的...

    Mysql数据库实现一个字段关联多张表

    • Ps:由于我的数据库功底不是很扎实,所以如果有什么设计的不好的地方欢迎指出

    我用设计数据库的时候为了看清楚就用draw.io画了个图:
    关于draw.io的web端搭建,欢迎来看看我写的另一篇:Linux搭建draw.io的Web端

    数据库关系表.png

    • 这是我数据库设计的第一阶段画的图,总共17张表,从中很容易看出问题:

    问题所在:一个字段外键绑定多张表(comment和source)

    • 一开始我很可笑的以为如果一个字段通过外键绑定多张表后,只有某一张表有值即为满足条件,后来我在写Java类的时候越想越不对,外键的设定好像不是这么玩的,于是的就去实验了一下~
    • 果不其然,这种情况需要满足多张表同时拥有才可以~(哭)

    面临的抉择:推到重做,或者另谋出路

    • 我不知道别人是咋样的,反正个人是属于不到万不得已不会重来一遍的那种类型(懒)

    自定义设计

    • 首先对于comment和source的外键(后来好像还有一个praise也是)
      总之:不该有的外键统统干掉

    但是干掉之后怎么保证数据库的完整性呢

    • 我仔细考虑了外键的作用:在插入的时候一定要关联表中存在了外键插入的值才能成功插入
    • 于是我就自然而然地想到了一个思路:模拟外键,但是要去掉所有表都满足这个条件。即标题指出的,一个字段关联多张表。

    一个字段关联多张表的设计思路

    为了在插入的时候验证数据在某一张表中存在与否,我使用了触发器,关于触发器的概念在此不多赘述(主要是怕说不清,如果不是很了解可以看一下这位博主的文章

    触发器的设计

    -- praise		发生在之前,存在,则插入,不存在则抛出异常
    
    DROP TRIGGER IF EXISTS `praise_beforeInsert`;
    DELIMITER ;;
    CREATE TRIGGER `praise_beforeInsert` BEFORE INSERT ON `praise` FOR EACH ROW BEGIN
    IF new.type_id=1 THEN 
    	IF (SELECT COUNT(*) FROM user_comment WHERE comment_id =new.foreign_id)=1 THEN 
    		UPDATE user_comment SET like_num=like_num+1 WHERE comment_id =new.foreign_id;
    	ELSE 
    		signal SQLSTATE 'HY000' SET message_text = '手动抛出异常' ;
    	END IF;
    ELSEIF new.type_id=2 THEN
    	IF (SELECT COUNT(*) FROM dish WHERE dish_id =new.foreign_id)=1 THEN 
    		UPDATE dish SET like_num=like_num+1 WHERE dish_id =new.foreign_id;
    	ELSE 
    		signal SQLSTATE 'HY000' SET message_text = '手动抛出异常2' ;
    	END IF;
    END IF;
    END
    ;;
    DELIMITER ;
    insert into praise(user_id,foreign_id,type_id) value(1,16,2);
    
    
    -- user_comment			测试id是否存在,若不存在则报错
    
    DROP TRIGGER IF EXISTS `comment_beforeInsert`;
    DELIMITER ;;
    CREATE TRIGGER `comment_beforeInsert` BEFORE INSERT ON `user_comment` FOR EACH ROW BEGIN
    IF (SELECT COUNT(*) FROM user_comment WHERE new.parent_comment_id =comment_id)=0 THEN 
    		signal SQLSTATE 'HY000' SET message_text = '上级评论不存在' ;
    ELSE
    	IF new.type_id=1 THEN 
    		IF (SELECT COUNT(*) FROM `dish_custom` WHERE custom_id =new.foreign_id)=0 THEN 
    			signal SQLSTATE 'HY000' SET message_text = '菜品习俗id不存在' ;
    		END IF;
    	ELSEIF new.type_id=2 THEN
    		IF (SELECT COUNT(*) FROM `dish_history` WHERE history_id =new.foreign_id)=0 THEN 
    			signal SQLSTATE 'HY000' SET message_text = '菜品历史id不存在' ;
    		END IF;
    	ELSEIF new.type_id=3 THEN
    		IF (SELECT COUNT(*) FROM `dish_literary` WHERE literary_id =new.foreign_id)=0 THEN 
    			signal SQLSTATE 'HY000' SET message_text = '菜品典故id不存在' ;
    		END IF;
    	ELSEIF new.type_id=4 THEN
    		IF (SELECT COUNT(*) FROM `dish_recipes` WHERE recipes_id =new.foreign_id)=0 THEN 
    			signal SQLSTATE 'HY000' SET message_text = '菜品做法id不存在' ;
    		END IF;
    	ELSEIF new.type_id=5 THEN
    		IF (SELECT COUNT(*) FROM `restaurant` WHERE restaurant_id =new.foreign_id)=0 THEN 
    			signal SQLSTATE 'HY000' SET message_text = '菜馆id不存在' ;
    		END IF;
    	END IF;
    END IF;
    END
    ;;
    DELIMITER ;
    
    
    INSERT INTO `testcc`.`user_comment`
                (`comment_id`,
                 `user_id`,
                 `foreign_id`,
                 `parent_comment_id`,
                 `time`,
                 `content`,
                 `like_num`,
                 `status`,
                 `type_id`)
    VALUES (NULL,
            1,
            1,
            1,
            NULL,
            'content',
            0,
            1,
            5);
    		
    INSERT INTO `testcc`.`user_comment`
                (`comment_id`,
                 `user_id`,
                 `foreign_id`,
                 `parent_comment_id`,
                 `time`,
                 `content`,
                 `like_num`,
                 `status`,
                 `type_id`)
    VALUES (NULL,
            1,
            100,
            1,
            NULL,
            'content',
            0,
            1,
            5);
    		
    		
    
    		
    - source 只有在id存在的时候才能插入,否则报错
    
    DROP TRIGGER IF EXISTS `source_beforeInsert`;
    DELIMITER ;;
    CREATE TRIGGER `source_beforeInsert` BEFORE INSERT ON `source` FOR EACH ROW BEGIN
    IF new.type_id=1 THEN 
    	IF (SELECT COUNT(*) FROM `dish_custom` WHERE custom_id =new.foreign_id)=0 THEN 
    		signal SQLSTATE 'HY000' SET message_text = '菜品习俗id不存在' ;
    	END IF;
    ELSEIF new.type_id=2 THEN
    	IF (SELECT COUNT(*) FROM `dish_history` WHERE history_id =new.foreign_id)=0 THEN 
    		signal SQLSTATE 'HY000' SET message_text = '菜品历史id不存在' ;
    	END IF;
    ELSEIF new.type_id=3 THEN
    	IF (SELECT COUNT(*) FROM `dish_literary` WHERE literary_id =new.foreign_id)=0 THEN 
    		signal SQLSTATE 'HY000' SET message_text = '菜品典故id不存在' ;
    	END IF;
    ELSEIF new.type_id=4 THEN
    	IF (SELECT COUNT(*) FROM `dish_recipes` WHERE recipes_id =new.foreign_id)=0 THEN 
    		signal SQLSTATE 'HY000' SET message_text = '菜品做法id不存在' ;
    	END IF;
    ELSEIF new.type_id=5 THEN
    	IF (SELECT COUNT(*) FROM `restaurant` WHERE restaurant_id =new.foreign_id)=0 THEN 
    		signal SQLSTATE 'HY000' SET message_text = '菜馆id不存在' ;
    	END IF;
    ELSEIF new.type_id=6 THEN
    	IF (SELECT COUNT(*) FROM `user_comment` WHERE comment_id =new.foreign_id)=0 THEN 
    		signal SQLSTATE 'HY000' SET message_text = '评论id不存在' ;
    	END IF;
    ELSEIF new.type_id=7 THEN
    	IF (SELECT COUNT(*) FROM `game_step` WHERE id =new.foreign_id)=0 THEN 
    		signal SQLSTATE 'HY000' SET message_text = '游戏步骤id不存在' ;
    	END IF;
    ELSEIF new.type_id=8 THEN
    	IF (SELECT COUNT(*) FROM `commodity` WHERE commodity_id =new.foreign_id)=0 THEN 
    		signal SQLSTATE 'HY000' SET message_text = '商品id不存在' ;
    	END IF;
    ELSEIF new.type_id=0 THEN
    	IF (SELECT COUNT(*) FROM `dish` WHERE dish_id =new.foreign_id)=0 THEN 
    		signal SQLSTATE 'HY000' SET message_text = '菜品id不存在' ;
    	END IF;
    END IF;
    END
    ;;
    DELIMITER ;
    
    
    INSERT INTO `testcc`.`source`
                (`source_id`,
                 `foreign_id`,
                 `url`,
                 `source_preview_url`,
                 `type_id`)
    VALUES (NULL,
            1,
            'http://www.aliyouth.cn/repository/Image/CodeResource.png',
            'http://www.aliyouth.cn/repository/Image/CodeResource.png',
            '0');
    
    INSERT INTO `testcc`.`source`
                (`source_id`,
                 `foreign_id`,
                 `url`,
                 `source_preview_url`,
                 `type_id`)
    VALUES (NULL,
            100,
            'http://www.aliyouth.cn/repository/Image/CodeResource.png',
            'http://www.aliyouth.cn/repository/Image/CodeResource.png',
            '0');
    
    • 以上我我设计的三个触发器,实现思路很简单在插入之前(BEFORE INSERT )利用IF函数根据type_id判断foreign_id的值在要关联的表中是否存在,若不存在则报错,也就阻止了插入,满足了我目前的需求。

    检讨与反思

    • 用触发器,这增加了数据库的负担,在大型项目尤其是对数据库压力比较大的项目中是不可取的行为,能多建几张表解决的问题尽量不要用到触发器~
    展开全文
  • Sql Server 数据库增加字段

    万次阅读 2018-08-31 19:07:40
    在工作中有可能因为需要对数据库增加一字段,DDL 语句 ALTER TABLE 表名 ADD 字段字段的类型名称(长度) ALTER TABLE TUser ADD shortName VARCHAR(10) 这有更多的介绍...

     在工作中有可能因为需要对数据库增加一列字段,DDL 语句

    ALTER TABLE 表名 ADD 字段名 字段的类型名称(长度)

    ALTER TABLE TUser ADD shortName VARCHAR(10)

    这个有更多的介绍

    展开全文
  • MySQL数据库添加一个字段

    千次阅读 2014-03-14 11:14:28
    源:... 评: 1、添加一个字段 alter table tableName add 列名 数据类型; 2、添加一个字段设置默认值 alter table tableName add 列名 数据类型 default 0; (注:设置默认值为0)...
    源:http://hi.baidu.com/pianxicun/item/bf6785097ba43d304bc4a36d
    
    评:
    1、添加一个字段

    alter table tableName add 列名 数据类型;

    2、添加一个字段设置默认值

    alter table tableName add 列名 数据类型 default 0;

    (注:设置默认值为0)
    展开全文
  • 解决 数据库mysql增加字段很慢添加字段很慢环境如下:mysql5.6 数据仅仅3w alter table xxx add column yyy int default 0; 添加字段很慢,好几份中都没有好。。原因以及解决[SQL] alter table grejx_def add ...
  • 今天处理一个生产环境报NullPointerException的问题,根据查询的对象,获得对象中的一个字段,结果为空。   报错位置:int partnerCode = servicefeeRecord.getPartnerCode().intValue(); (注:本身这直接取...
  • Android之实现Room升级需要给一个增加一个字段

    千次阅读 热门讨论 2021-03-21 22:44:27
    Room升级数据库一个增加一个字段。 2、Room升级介绍 Room 持久化库中通过使用 Migration 类保存用户数据。每个 Migration 类指定起始版本和结束版本。在运行时,Room 运行每个 ...
  • 数据库 增加字段

    千次阅读 2018-06-14 11:22:04
    alter table domain_conf_ext add user VARCHAR(45) default NULL
  • sqlserver为数据库增加自增字段

    千次阅读 2016-12-01 14:10:53
    在sqlserver上对已用数据表增加自增字段,并次性对所有现存记录加上编号。
  • mysql如何在一个数据库所有表都增加一个字段? http://bbs.csdn.net/topics/380182084 http://blog.csdn.net/chinawangfei/article/details/52232498 扩展问题: http://bbs.csdn.net/topics/391078924 ...
  • 数据库增加字段加备注

    千次阅读 2019-05-06 14:47:57
    alter table 表名 add (字段字段类型 ); COMMENT ON COLUMN 表名.字段名 IS ‘备注信息’;
  • 数据库中如何新增一个字段

    千次阅读 2020-04-26 06:30:01
    数据库中新增一个字段: alter TABLE t_Execution(表名) add FIsModifyQuote(列名) int(1)(字段的属性和长度) not NULL(设置非空) DEFAULT 0(默认值设置为0) 接下来在数据库中新增多个字段: alter TABLE t_...
  • 在hibernate中增加一个数据库字段

    千次阅读 2014-06-06 09:38:18
    报错:Null value was assigned to a property of primitive type ...特别注意了,简单类型不能为空,但是数据库给简单类型赋值为NULL,所以应该把数据库中该字段值改为能够被赋的值如0,1等,或者该变属性为封装类
  • 注意:修改数据库后,一定要记得增加数据库版本号 +1 . 否则不会走onUpgrade方法. 最残暴的方法: @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("drop ...
  • ALTER TABLE T_SMSJ ADD F_CJBLCOUNT DECIMAL(18, 2) NOT NULL DEFAULT ((0))
  • MySQL数据库增加和删除字段

    千次阅读 2017-11-24 20:07:56
    1增加个字段: mysql> create table id_name(id int,name varchar(20)); Query OK, 0 rows affected (0.13 sec) mysql> alter table id_name add age int,add address varchar(11); Query OK, 0 rows ...
  • FMDB 数据迁移即数据库增加字段

    千次阅读 2016-11-17 14:31:15
    最近公司需要新项目,需要数据持久化 ,使用的是FMDB操作Sqlite,在正常使用过程中没有什么毛病的,但是如果一旦需求改了 需要增加字段的时候就必须要重新写 或者用户重新卸载安装,这就会造成用户数据丢失。...
  • 数据库中如何新增一个字段

    万次阅读 2018-07-11 16:20:23
    如何在数据库中新增一个字段:alter TABLE t_Execution(表名) add FIsModifyQuote(列名) int(1)(字段的属性和长度) not NULL(设置非空) DEFAULT 0(默认为0)如何z接下来在数据库中新增多个字段:alter TABLE t_...
  • mongodb数据库添加或者删除一个字段

    千次阅读 2019-02-20 14:55:52
    1.添加一个字段.xxx 代表表名 , 添加字段 content字符串类型。 db.xxx.update({查询条件}, {$set: {content:""}}, {multi: 1})。 2 删除一个字段 db.xxx.update({查询条件},{$unset:{"content&...
  • Delphi操作SQLSERVER数据库动态增加字段..rar
  • 数据库增加字段注意事项

    千次阅读 2013-12-25 16:28:19
    数据库 前提:单表大数据量,添加字段并且加默认值 问题:ALTER TABLE XXX ADD (AAA NUMBER(19,4) DEFAULT 0); 描述:上述sql会占大量的undo空间,同时还会锁表,在线系统绝对不能这样做 解决方法:  第步:ALTER...
  • 升级数据库增加字段之OrmLite

    千次阅读 2017-07-28 14:02:39
    使用OrmLite数据库 在升级过程中,增加表字段: 首先我们写自己的DbOpenHelper继承OrmLiteliteOpenHelper,定义数据库名称,版本号,初始化用户表 public class DbOpenHelper extends OrmLiteSqliteOpenHelper { ...
  • mybatis数据库字段增加

    千次阅读 2018-04-11 16:45:42
    http://zhanghteye.iteye.com/blog/2372572今天处理一个生产环境报NullPointerException的问题,根据查询的对象,获得对象中的一个字段,结果为空。 报错位置:int partnerCode = servicefeeRecord.getPartnerCode...
  • SQLite 仅仅支持 ALTER TABLE 语句的一部分功能,我们可以用 ALTER TABLE 语句来更改一个表的名字,也可向表中增加一个字段(列),但是我们不能删除一个已经存在的字段,或者更改一个已经存在的字段的名称、数据...
  • Mysql数据库之在指定字段后加入字段

    千次阅读 2020-09-30 09:46:39
    Mysql数据库之在指定字段后加入字段 alter table tablename add column columnname varchar(64) not null after somecolumn; tablename指的是表名,columnname指的是新增字段名,somecolumn指的是表中原有的字段。no...
  • 数据库设计之备用字段

    千次阅读 2014-01-12 22:30:46
    前几天在做一个web项目设计数据库时,一直在考虑是否需要设置备用字段。自己感觉增加备用字段用处不大,效率低,破坏命名标准。后来上网查了一下有一下比较: 有必要: 如果没有备用字段,如果后期要加字段,用add ...
  • 在mysql数据库原有字段增加新内容

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 399,166
精华内容 159,666
关键字:

数据库增加一个字段