精华内容
下载资源
问答
  • 以下是我遇到的数据库表新增列的情况(数据库名和表名用DB1和TABLE1代替),数据库为ORACLE,为新增列时做的测试,总共三种类型的语句: 新增列,但不设置默认值 新增列,设置默认值 新增列,设置默认值,并且设置新增...

    难免会遇到线上环境数据表需要新增列的情况,如果的大表新增列的情况下,那就需要谨慎,新增列可能会导致长时间锁表,影响线上访问。

    以下是我遇到的数据库表新增列的情况(数据库名和表名用DB1和TABLE1代替),数据库为ORACLE,为新增列时做的测试,总共三种类型的语句:

    1. 新增列,但不设置默认值
    2. 新增列,设置默认值
    3. 新增列,设置默认值,并且设置新增列值为NOT NULL

    以下为抽取出的各个语句执行消耗时间情况,从下面可以看出第2中情况速度最慢,第3中情况效率很快,和第1中情况差不多(如有条件可以自行多测试几次),第1中情况和第2中情况比,第2中情况需要做更新操作,需要锁表,第2中情况慢那么多可以理解,毕竟所有的数据都要更新;但第3中情况竟然比第2中情况快了近100倍,简直不可以思议

    ALTER TABLE "DB1"."TABLE1" 
    ADD ("CERT_SOURCE2" VARCHAR2(2 CHAR) DEFAULT 0 NOT NULL )
    > OK
    > 时间: 0.015s
    
    ALTER TABLE "DB1"."TABLE1" 
    ADD ("CERT_SOURCE3" VARCHAR2(2 CHAR) DEFAULT 0)
    > OK
    > 时间: 1.154s
    
    ALTER TABLE "DB1"."TABLE1" 
    ADD ("CERT_SOURCE4" VARCHAR2(2 CHAR) DEFAULT 0  NOT NULL )
    > OK
    > 时间: 0.011s
    
    ALTER TABLE "DB1"."TABLE1" 
    ADD ("CERT_SOURCE5" VARCHAR2(2 CHAR) DEFAULT 0 )
    > OK
    > 时间: 1.647s
    
    ALTER TABLE "DB1"."TABLE1" 
    ADD ("CERT_SOURCE6" VARCHAR2(2 CHAR)  
    > OK
    > 时间: 0.011s
    

    经过多方求证:
    如果要在一张已经存在的表中添加一个字段,没有指定默认值的话他默认为NULL,当你指定了默认值的时候数据库直接在每行上直接更新添加的值, 这需要花上一段时间,并且会在这段时间内产生DML 锁。
    对于一些类型表(例如没有lob字段的表) 如果你添加的字段是not null 的并且有一个默认的初始值,数据库能够对添加列进行优化, 减少大量数据库被DML锁的时间。

    另外:default 0 not null,Oracle并没有真实的去修改列的值,只不过通过查询的时候,采用类似NVL(null,新值)的 方法转换一下,让以前的列看起来象有值一样。这个过程在select 的时候就转换好了,所以,对于使用者看来,他们是有值的。但如果抽取这个表的数据,抽取到的列值还是null。

    而我的表中所有的字段要么是varchar,要么是int,没有特殊字段,当增加了NOT NULL时,数据库对添加列进行了优化,减小了数据库被行锁的时间。

    如果想了解更多关于数据库添加列时需要注意的,我觉得这篇文章可以参考下

    展开全文
  • 工作中遇到:在为一个表新增字段后,新增字段在最后,想调整新增字段位置。  1、原始方法: --新建临时表以存储正确顺序 create table A_2 as select (column1,colum2,……A表中顺序) from A_1 ; --删除...

     工作中遇到:在为一个表新增字段后,新增字段在最后,想调整新增字段的位置。

      1、原始方法:

    --新建临时表以存储正确的顺序 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;

     

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

      2、利用系统数据库

      [1] 首先,以sys用户的身份登录PL/SQL

          [2] 查询出你要更改的表的ID,以我本地的数据为例,我要改'FINACE'用户下'INCOME'这张表。注:ORACLE中的表要用大写。

    select object_id from all_objects where owner = 'FINACE' and object_name = 'INCOME' ;

            得到INCOME这张表的i,如图所示:

      

          [3] 根据id去查询该表中的字段以及字段序号

    select obj#,col#,name from sys.col$ where obj#=73626; 

            结果如下图所示:

      

          [4] 第二列便是字段的序号,就可以用update语句来任意调整字段的顺序了。

    展开全文
  • 由于生产环境,用是DG架构,因此在数据库同事协助下,利用DG备库snapshot功能,在生产环境,真实操作了一次,虽然和主库操作,唯一不同是,没有请求压力,相当于停了应用,但还是能说明些问题。...

    大表删除字段为何慢?

    》的案例中,提到删除一张大表的字段,产生了很多等待,但是测试环境模拟的现象,看起来和生产,略有区别。

    由于生产环境,用的是DG架构,因此在数据库同事的协助下,利用DG备库snapshot的功能,在生产环境,真实操作了一次,虽然和主库操作,唯一不同的是,没有请求的压力,相当于停了应用,但还是能说明些问题。

    整个删除操作,执行时间,大约是30分钟,通过10046的trace,看见等待事件,主要是下面这种,

    08cf390091ca8fb2a404d73407493fe1.png

    从这段内容中,有几点值得说明,

    1. db file scattered read

    Oracle在执行全表扫描(Full Table Scan,FTS)或全索引扫描(Index Full San)时,为保障性能,尽量一次读取多个块,这称为Multi Block I/O,即多块读。每次执行Multi Block I/O,都会等待物理I/O结束,此时等待的,就是db file scattered read事件。这个等待事件包含三个参数:

    file#:要读取的数据块所在数据文件的文件号。

    block#:读取的起始数据块号。

    blocks:需要读取的数据块数目。

    2. obj#=11111

    obj#对应的是dba_objects视图中的字段object_id,所以,根据object_id,可以检索出object_name,就知道正是删除字段的表名,说明这些等待,产生在删除字段的表上。

    3. file#=10

    file#对应的是dba_data_files视图中的字段file_id,根据10046这个trace文件中,“db file scattered read”出现的上下文,可以看出不同的file_id,通过检索dba_data_files,可以得出结论,会遍历所有数据表空间对应的数据文件,

    5e644ce2723e2c4044f2cf4f342d2bbc.png

    wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

    众所周知,alter table语句是条DDL,在Oracle中其实会被转成DML语句来执行,但DDL和DML不同之处,就在于这种DDL会有隐式提交,因此执行完成,会自动commit,无法回滚,既然是条DML,就会产生redo,就会占用undo空间,这就能解释,为何执行过程中,出现大量“db file scattered read”,这种等待事件,原因就是要将表中所有数据,注意是所有数据,从本地磁盘文件,读到buffer cache,需要真实删除每行的这列值。还有个知识点,就是在删除的过程中,是可以select每条记录,原因就是undo提供的一致性读,Oracle体系结构的基础理论,在此刻,发挥作用,这个问题,要是开始没明白,说明还是对体系结构,理解不深入,没有条件反射。这些问题,还要感谢dbsnake的指教,他还指出,像PG,和Oracle不同的是,他的DDL,是需要显示commit,因此就能回滚DDL。

    关于大表删字段,有些老师朋友,提供了他们碰见的问题,以及建议,

    1. kill删除字段的会话,再次查询表会报ORA-12986,需要truncate表才能继续,此时要是没备份,就凉凉了。

    306378ece895d35a882e54da5d89da5e.png

    wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

    这篇文章提到了这个错误,

    https://blog.csdn.net/u011116642/article/details/51540314

    有人还做了测试,

    1. 将列置为unused

    ALTER TABLE test1 SET UNUSED COLUMN Tablespace_name;

    2. 删除unused列

    ALTER TABLE test1 DROP UNUSED COLUMN CHECKPOINT 5;

    在未执行完毕前,用shutdown abort强制关闭数据库(如果用shutdown immediate就看不到效果,它会等到执行完毕才会关闭数据库)

    3. 重新启动数据库,查看test1表,报错,

    f557d52f9599b9624741c8c49f01d868.png

    4. 继续删除未删完的列

    ALTER TABLE test1 DROP COLUMNS continue

    5. 执行完毕后再次查询test1表,就OK了

    2.可以尝试逻辑删除,然后再物理删除,即线上置为unused,等维护窗口,再删除这个字段,如下面这篇文章,

    https://blog.csdn.net/caimaohua/article/details/4264040

    3. 使用在线重定义,删除字段,如下文章所介绍,

    http://m.blog.itpub.net/17203031/viewspace-772500/

    https://blog.csdn.net/qq_33879355/article/details/78578175

    4. 如果有停机时间,可以采用CTAS重建表,间接删除字段。

    针对这个问题,我们采用的,算是第五种方法,即不动这字段,作为备份字段,未来新需求要增加字段,就直接改这字段,当然这是有些前提的,

    1. 应用中对该字段的引用,需要删除,例如insert操作,需要删除这个字段名称,否则就会出问题。

    2. 新增字段的类型,要和这个字段类型兼容,比如这字段是VARCHAR2,新增字段需要DATE,自然不能直接改。

    对这个问题,要是有什么新的见解、看法,欢迎提出来,一起讨论。

    展开全文
  • mysql表新增添加一

    万次阅读 多人点赞 2017-10-10 17:27:41
    mysql如果想在一个已经建好的表中添加...但就仅新增这个问题,可以有以下操作: 针对数据库:mysqlALTER ... ADD COLUMN .... 在表的最后一增加新ALTER TABLE `tbname` ADD COLUMN `state` TINYINT(2)

    mysql表新添加一列

    有这样的需求,已经建立的表,随着需求的变化,会需要在这个表增加一列。当然可以新建表建立联系满足需求。
    但就仅新增一列这个问题,可以有以下操作:

    ALTER ...  ADD COLUMN .... 
    

    在表的最后一列增加新的一列

    ALTER TABLE `tbname`
    	ADD COLUMN `state` TINYINT(2) NOT NULL DEFAULT '0' COMMENT '0为添加1为编辑' 
    

    在指定的位置增加新的一列

    ALTER TABLE `tbname`
    	ADD COLUMN `state` TINYINT(2) NOT NULL DEFAULT '0' COMMENT '0为添加1为编辑' AFTER `column_name`;
    

    在第一列增加新的一列

    ALTER TABLE `tbname`
    	ADD COLUMN `state` TINYINT(2) NOT NULL DEFAULT '0' COMMENT '0为添加1为编辑' FIRST;
    

    谢谢。

    展开全文
  • 修改oracle数据库表的列字段类型 表里有数据存在直接修改类型肯定失败 1. 直接修改 ,错误如下; 提示表不为空不能修改。其实我们想一想也知道,原有数据改动类型,可能会出问题。能把汉字转为number吗? 2. 那么...
  • 今天接到一个需求,设计,动态行,动态, 大概页面长这个样子, 需求:每行为一个二级科目(隶属于一级科目),取值范围来自于值列表(理解为一个固定集合就行),用户动态选择,每张不一样。 每列为一个...
  • 问题】makemigrations是会要求id输入默认值 例如下UserVerifyCode,自定义了idUser这个key 修改成如下,去掉idUer主键属性 使用python manage.py makemigrations,id是新增列,不能为空,所以必须输入默认值 ...
  • sqlite 修改表的列

    2020-09-01 18:38:47
    ALTER命令2.1 重命名2.2 新增列3. 重建修改列3.1 重命名3.2 重新创建3.3 插入数据3.4 删除旧的表4. 总结 sqlite 修改表的列 软件都是在不断升级和变化,在软件世界列唯一不变就是变化;同样对于...
  • 在开发中,会经常遇到对表(table)结构,(column),评论(coment),序列(sequence)微调;下面就将这些对象增删改查操作总结如下,有些特殊对象没有修改等方法,就不写了;如果有大神指导,欢迎留言;另...
  • 一、问题在开发中,会经常遇到对表(table)结构,(column),评论(coment),序列(sequence)微调;下面就将这些对象增删改查操作总结如下,有些特殊对象没有修改等方法,就不写了;如果有大神指导,欢迎...
  • 一、问题在开发中,会经常遇到对表(table)结构,(column),评论(coment),序列(sequence)微调;下面就将这些对象增删改查操作总结如下,有些特殊对象没有修改等方法,就不写了;如果有大神指导,欢迎...
  • 没有id列 另一台服务器是以windows身份验证登陆的 有一个3 现在想要把1的A B C三列的值、2的D E两列的值同时分别插入到3的b d f和c e列当中并且之后连续的将12新增的数据插入 应该如何实现
  • 在项目应用中,已经创建好的数据库,难免涉及到新增列的问题,但是在加入列之前要做个判断,该是否已经存在,要不执行数据库会报错!另附删除列的操作…… 1、新增列的代码:[db executeUpdate:@"alter table 表名 ...
  • 本文主要向大家介绍了如何使用mysql在建好的表中添加一,通过具体代码向大家展示,希望对大家学习...但就仅新增这个问题,可以有以下操作:针对数据库:mysqlALTER... ADDCOLUMN....在表的最后一增加新...
  • 本文主要向大家介绍了如何使用mysql在建好的表中添加一,通过具体代码向大家展示,希望对大家学习...但就仅新增这个问题,可以有以下操作:针对数据库:mysqlALTER... ADDCOLUMN....在表的最后一增加新...
  •  行转转行是我们在开发过程中经常碰到的问题。行转一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现。 用传统的方法,比较好理解。层次清晰,而且比较习惯。 但是...
  • 在网上查了下原因,是说因为dataGridView 在新增列时会自动插入一个新空白行,导致插入值为NULL 不能ToString() 后面试了下先判断Value值不为空再做转换 发现Value值是空是什么原因? ![图片...
  • 向SQLite数据库新增列,之前出现过报错为提示no such column,通过删除并重建数据库文件解决,这次报错...ContentProvider 在关联数据库时须定义UriMatcher并将新增列写入对应Hashmap,否则无法识别到数据表的列值...
  • 10.4.3 数据库表的检索查询 216 小结 217 复习题 217 练习题 217 实验练习题 217 参考文献 218 第11章 XML:可扩展标记语言 219 11.1 XML层次(树)数据模型 219 11.2 XML文档、DTD和XML模式 ...
  • 首先借用书本(book)的这个数据模型:?添加字段当要向一个产品设置(或者说是model)添加一个...然而 这里有一个鸡生蛋蛋生鸡的问题 ,由于要想了解新增列的SQL语句,你需要使用Django的 manage.py sqlall命令进行查...
  •  本书是一本讲述数据库系统原理教材,重点强调数据库建模与设计基础、数据库管理系统提供语言和工具以及系统实现技术。全书共分4个部分,第一部分介绍最基本概念、术语及建模原则,第二部分描述了关系数据...
  • 解决:(1)那就把后面小对号选中(表示可以取空值),然后对数据库表的所有元组内容,对新增的列进行赋值 即可(可以去空值,意思是该值可以是空值也可以不是空值,只是对一个元组整体插入有限制而已...
  • 解决在分表情况下, IN 子句中分表列只支持 int32,不支持int64 的问题 解决连接断开的内存泄露问题 在连接的结构体的释放接口中,lock 的成员变量未释放,导致在连接断开,回收连接对象时会泄漏24个...
  • 13.该类库仅仅是把对数据库操作常用代码封装而已,并没有真正意义ORM,充其量只算半个ORM,程序还是“依赖”数据表的字段(实际应用时,数据表的字段名很少改变)。关于这个问题很难说得清楚,只有真正用时才会...
  • 数据库原理(第5版)

    千次下载 热门讨论 2011-11-08 13:41:53
    而且这一方法也避免了一个常见的问题:在同时介绍概念和产品时,学生容易混淆概念与产品特性和功能。例如,在讲授参照完整性约束时,如果从概念的角度讲授会说明这时一个中的值必须总是由另一个中的值提供,...
  • orcale表的创建

    2019-05-28 08:12:45
    oracle中查询语法是最常用语法,基础中基础,而这些基础中创建数据库表也是基础,为25什么说查询语法是最常用语法,基础中基础呢?这个是因为很多基础语法都是建立在查询之上;但是还有一个问题,必须...
  • 1、删了数据库某些,现在希望新插入值仍然从1开始,怎么办?(不能用drop,然后再create一张这种愚蠢办法) 2、jvm中调整栈大小参数:-Xss 3、海量数据排序? 4、Arrays.sort()默认实现是什么? ...
  • 输入时有闪动的问题暂时没能完美解决。 时间仓促很多功能还没有时间做完,希望大家多提意见。 Nightingale QQ:851082415 最近更新内容,点击校验按钮,系统自动识别关键字,数据表名和字段并染色。 解决了输入...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 229
精华内容 91
关键字:

数据库表新增列的问题