DB2
标签(空格分隔): 数据库
数据库状态横纵标
1、横表和纵表
横表就是普通的建表方式,如表结构为:主键、字段1、字段2、字段3…
纵表表结构为: 主键、字段代码、字段值。而字段代码则为字段1、字段2、字段3…。
横表
优点:一行表示了一个实体记录,清晰可见,一目了然。
缺点:如果现在要给这个表加一个字段,那么就必须重建表结构。
纵表
优点:如果现在要给这个表加一个字段,只需要添加一些记录。
缺点:数据描述不是很清晰,而且会造成数据库数据很多。另如果需要分组统计,要先group by,较繁琐。
结论
应该把不容易改动表结构的设计成横表,把容易经常改动不确定的表结构设计成纵表。
https://blog.csdn.net/zhangzeyuaaa/article/details/50675058
纵表转横标
有如下纵表:
将其转为横表:
select
s.student_name,
sum(case s.subject when '语文' then s.score end) as 语文,
sum(case s.subject when '数学' then s.score end) as 数学,
sum(case s.subject when '英语' then s.score end) as 英语
from score_vertical s
group by s.student_name
结果:
横表转纵表
有如下横表:
将其转为纵表:
select s.student_name,
'语文' as 科目,
s.语文 as 成绩
from score_horizontal s
union all
select s.student_name,
'数学' as 科目,
s.数学 as 成绩
from score_horizontal s
union all
select s.student_name,
'英语' as 科目,
s.英语 as 成绩
from score_horizontal s
order by student_name, 科目
结果:
数据库语法
1. 查询/删除/建立DB2数据表的主键
instancename:schema名称 tablename:表名 primarykeyname:
--CALL命令
call sysproc.admin('自己写的SQL命令');
一、查询表主键。
describe indexes for table <instancename>.<tablename>
例:这个命令在DbVisualizer中不能执行,在命令行中可以。
describe indexes for table db2inst1.aaa;
二、删除表主键。
alter table <instancename>.<tablename> drop primary key
例:
alter table db2inst1.aaa drop primary key
三、建立表主键。
alter table <instancename>.<tablename> add CONSTRAINT <primarykeyname> PRIMARY KEY (<columnname1>,<columnname2>
例:
alter table db2inst1.aaa add constraint aaa_pk primary key(id)
四、增加联合主键字段
1、第一步设置数据库要增加到联合主键的字段为null
ALTER COLUMN columnname SET DATATYPE VARCHAR(20) NOT NULL;
2、删除所有主键 参考上面
3、修改主键
4、CALL命令 重组表结构
CALL SYSPROC.ADMIN_CMD('REORG TABLE TABLENAME');
2.建表、表空间,添加字段,删除字段,修改字段,转换类型等
--创建数据库
create database Etp;
--创建数据库指定表空间。
tablespace:表空间名 indexspace:索引空间名
create table xxx(col1...) IN tablespace INDEX IN indexspace
--连接数据库
connect to Etp;
--断开连接
disconnect Etp;
--查看当前数据库下有哪些表
list tables;
--删除表
drop table SchemaName.TableName;
--复制表
CREATE TABLE SchemaName.新生成的表 LIKE SchemaName.原始表
INSERT INTO SchemaName.新生成的表 SELECT * FROM SchemaName.原始表;
--创建表的同时添加约束方式1
create table SchemaName.TableName(
stuNo int not null,
stuName varchar(8) not null,
stuAge int,
stuTel char(8),
constraint pk_stuNo primary key(stuNo),
constraint un_stuName unique(stuName),
constraint ch_stuAge check(stuAge >=0 and stuAge <150)
);
--创建表的同时添加约束方式2(建议用第二种,简单便捷)
create table SchemaName.TableName(
stuNo int not null primary key,
stuName varchar(8) not null unique,
stuAge int check(stuAge >=0 and stuAge <150),
stuTel char(8)
);
--查看表结构
describe table SchemaName.TableName;
//字段的增删查改
alter table SchemaName.TableName add ColumnName DataType(长度);
--新增表字段
alter table SchemaName.TableName add stubirth date;
alter table SchemaName.TableName add abc int;
--删除字段
alter table SchemaName.TableName drop column abc;
--修改字段类型
alter table SchemaName.TableName alter column stutel set data type char(11);(颜色标记为,与SQL Server的区别)
2. 更改字段类型
alter table 表名称 alter column 字段名 set data type 类型(长度)
alter table table_name alter column column_test set data type VARCHAR(3);
--增加一个非空约束
alter table SchemaName.TableName alter column stutel set not null;(颜色标记为,与SQL Server的区别)
3. 转换字段数据类型
`proc` 要修改的字段名 varchar类型转换成小数类型
SELECT `proc` FROM `table` ORDER BY CAST(`proc` AS decimal) DESC;
3.树结构
查询一个顶级节点的名称
常见错误:
1、SQLCODE=-668, SQLSTATE=57016 表被挂起
- DB2 SQL Error: SQLCODE=-668, SQLSTATE=57016错误解决方法
这个错误是:表处于”装入暂挂”状态。
经多次尝试 总结方法:
1:reorg table <表>; 假如不好使 则下面方法
2,先前尝试装入(LOAD)此表失败。表的状态应该是load pending;
你可以执行一下db2 "load query table <tabname>"命令来查看你的表状态。
然后用db2 "load from /dev/null of del terminate into <tabname>"这个命令来解挂。
然后 reorg table <表>
3,恢复时候 没有指定过roll forward选项
是数据库的原因,因LOAD异常中断引起,可以用LOAD… TERMINATE 或者RESTART来解决.
先在C:建一个空文件test.txt,
然后db2 load from c:/test.txt of del terminate into tablename
然后 reorg table <表>
然后就可以了!
这几种方法尝试后OK。