精华内容
下载资源
问答
  • 插入一行知道,怎么增加一呢 菜鸟求救!!!!!!!
  • 光看文章的题目可能很难明白我想说什么,还是先描述一下项目遇到的问题吧。 我们项目一张这样的表用来保存各种“资源”,假设为资源1、资源2……等等,用ResGenre来标识。 我们可以认为资源类型是个抽象的...

    光看文章的题目可能很难明白我想说什么,还是先描述一下项目中遇到的问题吧。

    我们项目中一张这样的表用来保存各种“资源”,假设为资源1、资源2……等等,用ResGenre来标识。

    我们可以认为资源类型是一个抽象的概念,资源1、资源2这些都是资源子类。一开始所有这些子类型都只有ResId,ResName等几个字段,一张ResInfo表就可以满足需求了。但是我们都知道项目千变万化,唯一不变的就是“变化”。随着业务的发展可能资源子类型越来越多,头疼的是原来的这张表的几个字段已经满足不了需求了,各个子类型的字段在不断扩充,最头疼的是它们加的字段都各不相同……这时该怎么办?

    大概有以下几种办法:

     

    单表继承

    所谓单表继承就是所有的字段都保存在一张表上,增加字段时就扩充原来的表。

    这种方法优点简单粗暴,当子类型很少以及子类型的特殊属性很少的时候还是可取的。但是如果子类型达到了10几个,而且子类型的字段很多时缺点也显而易见:冗余太多,某一行记录存在许多与当前子类无关的属性,而且页面管理起来也相当繁琐,每次增加一个字段的时候,所有子类型都受到影响。

     

    每个子类型创建一个表

    添加一个子类型就增加一张表。

            ……

    两个子类型存储完全独立,每增加一张表页面就要重新管理一张表,子类型很多的时候这种方式也不是很好。

     

    多表继承

    既有基表,又有子类型表,就像面向对象里面的继承。

    多表继承的方式可以减少字段的冗余,但是同样的子类型很多时,表较多,管理起来比较麻烦。

     

    半结构化数据模型

    如果有很多子类型或者必须经常增加新的字段支持,那么可以用一个BLOB列来存储数据,用XML或者JSON格式。

     Property是一个属性列:它可以用Json来存储额外增加的字段:同时包含了字段名字和值。

    {
         "Field1":"Value1","Field2":"Value2"
    }
    

    这种方式实际上是在关系型数据库里运用了nosql的思想,有点实现了MongoDB的无模式文档存储的意思,但是我们都知道无模式的存储好处是扩展方便,坏处是更新修改麻烦。我们用的是sql,解析json或xml起来肯定比用C#或Java麻烦,所以使用这种方式我更倾向于将更多的业务逻辑抽离应用程序的代码中处理。

     

    使用NoSql

    这种处于关系型和非关系型之间数据存储要求,让我们第一个想到的肯定是MongoDB。而且MongoDB sql to aggregation基本实现了常用的关系型操作。但是考虑各种其他因素,这种方法成本比较高。

    上面的几种方法经过反复斟酌,不用nosql那么关系型数据库还应该干关系型数据库的事情,我放弃了一开始用“半结构化数据模型”这种方式的打算,但其他两种方式我也觉得不太合适,下面说下我最后准备使用的方法。

     

    使用行转列的方式

    和多表继承类似,有一个基表用来保存各个子类型共有的字段,这张表也可以叫做索引表,故名思议索引建立在上面。

    ResGenre表就是用来定义资源子类型的,ColumnMeta表用来定义新增列的元数据:

     

    ResGenreColumnRelation表用来绑定一个子类型有哪些字段:

    最后一张表来绑定一条资源记录扩展列的值:

    那么如何在查询的时候获取到一个资源的扩展字段和对应的值呢?如图一个测试表有数据如下:

    可以看到子类型14,15,16绑定了不同的列。

    我们想要得到结果应该是这样的:

    可以看到返回的结果集其实也是冗余的,对于一个ResID没绑定的列为NULL。

    在sqlserver2005中实现行转列的方式不需要再用CASE WHEN了,用PIVOT方便多了:

    SELECT *
    FROM ColumnDataBind 
    PIVOT
    (
        Max(ColValue) for [ColName] in ([Age],[High],[Sex],[Weight])
    )TBL

    需要注意的是PIVOT中必须要用聚合函数。因为ResGenreColumnRelation表用ResID和ColName作为键,所以PIVOT聚合时ColValue只有一个,用Max就行了。

    也可以跟上查询条件,减小操作数据集:

    SELECT *
    FROM ColumnDataBind 
    PIVOT
    (
        Max(ColValue) for [ColName] in ([Age],[High],[Sex],[Weight])
    )TBL
    where genreid =14

    当然既然实现的是能随便扩展列,那么一个资源绑定了哪些列肯定不知道的,动态行转列也是必不可少的,有了PIVOT也很简单:

    declare @sql varchar(8000)
    select @sql = isnull(@sql + '],[' , '') + ColName from ColumnDataBind group by ColName
    set @sql = '[' + @sql + ']'
    print @sql
    
    exec('SELECT * FROM ColumnDataBind PIVOT(Max(ColValue) for [ColName] in ('+@sql+'))TBL')

    这是在sqlserver2005+中实现动态行转列的方式,不知道MySql有没有PIVOT。

    通过这种方式当增加一个列的时候通过页面就能搞定,数据库就不需要频繁的改动了,而且更符合关系型数据库的操作。

     

    但是写完我又在“行转列”和“半结构化数据模型”之间犹豫了?前者应该能给予更大的灵活,但总觉得哪里很别扭,后者用起来估计也比较麻烦,设计经验不足,不知道哪位大神能指点指点? 

     

     

    展开全文
  • 1、加在 查询字段 或者 查询字段 + 排序字段 复合索引 2、加在 1.需要连接条件字段 2.需要分组的字段 3....3、在上加索引时事有条件的: ... --两个或多个经常同时出现在where子句或者连接条件 4、...
    1、加在 查询字段
    或者 查询字段 + 排序字段 复合索引

    2、加在 1.需要连接条件字段 2.需要分组的字段 3.需要排序的字段.

    3、在列上加索引时事有条件的:
    --经常被查询的列
    --order by子句中使用的列
    --是外键或者主键的列
    --列是唯一的列
    --两个或多个列经常同时出现在where子句中或者连接条件中

    4、在列上加索引时事有条件的:
    1)、经常被查询的列
    2)、order by子句中使用的列
    3)、是外键或者主键的列
    4)、列是唯一的列
    5)、两个或多个列经常同时出现在where子句中或者连接条件中
    展开全文
  • 今天在sql server论坛看到个帖子:如何数据库中个字段随时间自动更新? 那么如何来实现呢? 其实用sql server提供的 计算,就可以轻松实现这个需求。 例子如下: 员工表,有字段:人员id,姓名,人员...

    今天在sql server论坛看到一个帖子:如何让数据库中某一个字段随时间自动更新?

    那么如何来实现呢?

    可以用触发器,那么先要写个触发器,但是可能会影响性能。

    想了想,其实用sql server提供的 计算列,就可以轻松实现这个需求。


    例子如下:

    员工表,有字段:人员id,姓名,人员编码,人员入职时间,现在希望要增加一个字段显示工龄,就是在公司工作的时间,如 1.5年。

    if object_id('emp') is not null
       drop table emp
    go
    
    
    CREATE TABLE emp
        (
          emp_id INT PRIMARY KEY , 
          emp_name NVARCHAR(10) not null,
          emp_code VARCHAR(20) not null,
          hire_date DATE not null
        );
    go
    
    
    INSERT  INTO emp
    VALUES  ( 1, N'张三', '0000000100', '2015-01-01' );
    

    实现方法就是新增一个计算列:

    alter table emp
    add employment_time as cast(datediff(month,hire_date,GETDATE())*1.0/12 as numeric(8,1));
    
    select  * from emp;
    查询结果:


    何让数据库中某一个字段随时间自动更新

    展开全文
  • 前言前段时间,有人问我, 有个关于Oracle中表字段顺序调整的问题。...在修改顺序之前,我们先来看看Oracle数据库中如何增加字段。新增字段:添加字段的语法:alter table tablename add (column datatyp...

    前言

    前段时间,有人问我, 有一个关于Oracle中表字段顺序调整的问题。问题就是当设计好表结构之后,后期如果需要往表中增加字段,默认会把该字段放到表的最后,并且字段特别多而我们又想把有关联性的字段放在一起,这时就要修改字段顺序。在修改顺序之前,我们先来看看Oracle数据库表中如何增加字段。

    新增字段:

    添加字段的语法:alter table tablename add (column datatype [default value][null/not null],….);

    实例

    创建表结构:

    create table test1

    (id varchar2(20) not null);

    增加一个字段:

    alter table test1

    add (name varchar2(30) default ‘无名氏' not null);

    使用一个SQL语句同时添加三个字段:

    alter table test1

    add (name varchar2(30) default ‘无名氏' not null,

    age integer default 22 not null,

    has_money number(9,2)

    );

    字段顺序的修改

    第一种原始方法:

    删了重建,这种方法虽然简单粗暴,但不科学

    --新建临时表以存储正确的顺序

    create table A_2 as select (column1,colum2,……A表中的顺序) from A_1 ;

    --删除表A_1

    drop table A_1;

    --新建A_1并从A_2表中赋予其正确的顺序和值

    create table A_1 as select * from A_2;

    --删除临时表A_2

    drop table A_2;

    这种方法对字段较少的表来说还不会显得太麻烦,但是对于字段较多的表来说就吃力了。

    第二种方法(推荐):

    1、首先需要sys或system权限操作

    2、查询需要更改表的ID

    select object_id

    from all_objects

    where owner = 'ITHOME'

    and object_name = 'TEST';

    注:ITHOME为用户,TEST是要更改的表,表名要大写

    3、通过ID查出该表所有字段的顺序

    select obj#, col#, name

    from sys.col$

    where obj# = '103756' order by col#

    d0ba16261db3ef3e2b2243b1e3d6d3ad.png

    4、修改顺序

    update sys.col$ set col#=2 where obj#=103756 and name='AGE';

    update sys.col$ set col#=3 where obj#=103756 and name='NAME';

    或直接在第三步的语句后面加 for update 进行修改

    最后commit提交 并且重启Oracle服务

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

    时间: 2017-11-11

    展开全文
  • JAVA中如何给将List增加列? 情况是这样的: 先从数据库中查询结果放到个list1中,然后数据库中查询另外的结果放list2中,现在需要将list2的按拼接到list1,如下图,根据大类将list2拼接到list1的后面。 ...
  • 今天在sql server论坛看到个帖子:如何数据库中个字段随时间自动更新? 那么如何来实现呢? 可以用触发器,那么先要写个触发器,但是可能会影响性能。 想了想,其实用sql server提供的 计算,就可以...
  • 今天用到个需求,就是需要先用excel导出数据,然后利用excel某些数据来更改数据库,但是直接导出来的哪些数据没有带英文的单引号和双引号,这时候就需要先用excel处理下啦 选中当前列,然后右键,选择设置...
  • 数据库的使用过程我们经常要限制字段的取值,比如有些字我们不能让它为空,我们就需要添加非空约束,本关我们就来学习如何添加这些常用的约束。 为了更好学习,你需要掌握:1.怎么添加唯一约束;2.怎么添加非空...
  • 环境: 1.VS2015 Community 14.0.25431.01 Update 3; 2.其他环境(具体哪一个影响不太清楚,都列在这儿) ...利用系统提供的模板,并选择个人身份...以下图为例,绿色框的列都是模板默认的,我要增加一列(以Te...
  • 如何将Excel 表格 当成数据库来使用。举例说明:1.在工作簿表栏,点击插入新工作钮者按快捷键shift加F11,EXCEL将自动增加一个工作表。2.将新工作表改名为“数据库”。意为存储入库出库单据数据信息的仓库。3.接下来...
  • oracle数据库列的操作

    2018-02-06 16:13:00
    本章和大家分享一下如何数据库中进行的一些相关操作。 1.增加列名(我们先来看一个原始版本) 下面我们增加一个列名tel 记住,增加时需要把对应的数据类型要说明,不然会报错。 alter table ...
  • 1、(已实践)直接复制粘贴到表,步骤:excel的列跟oracle表的列对应一致,然后excel 左侧 比 oracle 多剪切一列,复制。打开表,点击增加一行,选中此行所有列,粘贴即可。2、(已实践)(plsql工具)通过...
  • 如何数据库中存储有顺序的数据

    千次阅读 2011-10-23 21:19:00
    数据库中的记录都是按照集合的方式来组织的,一个记录集中的... 一种直接而有效的方法是,在记录集(或表)中增加一个“顺序”(或叫“索引”字段),对表进行存入、取出或者排序的操作时,都可以依据“索引”字段...
  • 1、在数据库中查询时增加,这样在数据绑定时就可以将该字段用于绑定(有个问题,如果数据源不是来自于数据库呢)2、在程序中网页程序中增加(就是我现在想说的一种做法)具体方法如下:1)在aspx页面中增加一个...
  • 这里增加的自定义项,有的时候会出现保存的和你所添加的自定义不同,这里需要注意保存数据之后,发现表个主键PK,但是对应的是哪个表呢?经过数据字典表的筛选这里对应的表格是bd_defdoc,查询的时候,...
  • 从SQL Server 2005开始,增加了一个新的函数Row_Number(),他的一个很伟大的作用就是可以在数据表添加一列从1开始的行号,这样大大代替所有多余的代码来产生行号。下面就教大家如何使用Row_Number()函数。  假设...
  • 您将在下面找到一些有关如何执行常见任务的信息。 您可以在找到本指南的最新版本。 目录 自动格式化代码 更改页面<title> 安装依赖项 导入组件 代码分割 添加样式表 后处理CSS 添加CSS预处理器(Sass,Less...
  • 增加计算排序

    2015-07-30 10:45:15
    Q、.net如何增加对计算的排序? A、两种方法: 第种、数据库中先处理好计算 select (USDDeposit - USDWithdraw) as 'NetDeposit' from TableA order by (USDDeposit - USDWithdraw) asc // 数据库中...
  • 一、获取DataTable数据比表格元素更稳定 二、有关DataTable数据获取单个元素的值 三、如何在DataTable增加一列数据(增加时间戳字段) 四、DataTable和数据库Table字段的映射 ...
  • 数据库的学习笔记(

    千次阅读 2021-06-06 22:45:12
    添加主键约束给表添加外部关键字添加常用约束怎么添加唯一约束怎么添加非空约束设置表的属性值自动增加删除数据库中的表查看数据表基本结构查看数据表详细结构修改表名修改字段名修改字段数据类型添加字段删除字段...
  • (五)进阶技术  1. 增加列  数据仓库最常碰到的扩展是给个已经存在的维度表和事实表添加。...假设需要在客户维度中增加送货地址属性,并在销售订单事实表中增加数量度量值。  修改数据库模式  图(五)- 1-1
  • ... using System....将查询到的数据放入ds,这张表叫table可以通过ds["usertable"]访问到 close(); return ds; } //读取数据 public OleDbDataReader GetDataReaderValue(string sql) { ...
  • 个好用的数据库

    2008-05-14 08:36:06
    <br>三、实例练习 <br>下面就通过上面的例子一起来看一下这个类到底怎么样,为了方便,我建了个简单的access数据库test.mdb,在这个数据库中也只有一张表emp,它有三个字段。在下面的工程的InitInstance ()...
  • 数据库资料

    2018-04-01 22:00:33
    包含大量的冗余,可能会导致数据异常:更新异常 例如,修改职工号=1001的职务,则必须修改所有职工号=1001的行添加异常 若要增加一个新的职工时,首先必须给这名职工分配一个工程。或者为了添加一名新职工的数据...
  • 后来增加一列depCode,但是使用ibeetl的insertTemplate,depCode属性没有添加成功, 老师们,这是哪个地方的问题呢? ``` @Getter @Setter @Table(name = "tb_department") public class Department extends...
  • (2)在TEST数据库中创建Table2,只含各个基本(包括列名和数据类型,标识种子和计算)(3)Table1中的外键能否在创建Table1表时建立?如不能,该何时、如何创建?请写出相应的SQL代码。(4)通过ALTER TABLE...
  • 火龙果软件工程技术中心这段时间...在Tab页中选择Indexes2单击新建索引的属性,出现IndexexProperties3增加一个索引包含的字段2如何在PowerDesigner下建自增使用SqlServer数据库中的下列语句来完成建表语句中,在要做

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 490
精华内容 196
关键字:

数据库中如何增加一列