NN:NOT NULL 非空约束
UK:UNIQUE KEY唯一约束
PK:PRIMARY KEY 主键约束
FK:FOREIGN KEY 外键约束
CK:CHECK 条件约束
一张表必须要有一个字段为主键,这段不能为空,并且值唯一,oracle中一般将该字段定义为数值类型,用序列为该字段插入值;其他字段的约束要根据业务需求来定。
给表中的字段添加约束可以在创建表时添加,也可以在修改时添加。
创建表必须给出表名、字段名、字段类型,约束条件不是必须的。
例如:创建如下表时
CREATE TABLE tb_constraint_1
(
empno NUMBER PRIMARY KEY, --主键约束
ename VARCHAR2(20) NOT NULL,--非空约束
email VARCHAR2(60) UNIQUE, --唯一约束
sal NUMBER(5) CHECK(sal>1500), --核查约束
deptno NUMBER(4) REFERENCES tb_dept(deptno) --外键约束
)
修改已创建表中某个字段的约束:
alter table tb_constraint_1 add constraint yueshumingzi unique(ename )--修改姓名字段值必须唯一
创建表的外键约束时,外键字段的类型必须和关联表的主键的类型一致。
表名和字段名的长度oracle默认约定为长度不能大于30个字符
创建好的表,字段可以修改,以下是修改 添加表 删除表字段 格式:
alter table 表名 add 新列列名 列数据类型[default 0 not null] (添加列默认值为0)
alter table 表名 drop 列名 (删除列)
alter table 表名 alter column 列名 新添加的数据类型 (修改列)
1、外键的概念:外键是关系数据库三个完整性的五个约束条件之一,是表与表之间建立的一种关系。在Oracle数据库的scott/tiger用户中,表Dept和Emp通过外键进行了关联。在这里Dept表叫主表,Emp表叫从表,外键是字段Deptno。\x0d\x0a2、加入外键的条件:a、两个表有相同属性字段,取值范围相同;\x0d\x0a b、外键在主表中是主键或者是唯一字段;\x0d\x0a c、外键可以是多个字段的组合。\x0d\x0a 记住一句话:从表的外键是主表的主键或唯一字段。特总结了Oracle和DB2数据库下如何禁用外键约束的方法。一、Oracle数据库:
禁用约束基本语法:
alter table 数据库表名 disable constraint 约束名
假设现在需要关闭pub_organ的外键约束:
1、 首先查询pub_organ存在哪些外键约束,此时需要用到oracle的字典表user_constraints。
select * from user_constraints where table_name='PUB_ORGAN'
上图就是查询结果,其中各字段含义如下:
OWNER: 表的所有者
CONSTRAINT_NAME: 约束名称
CONSTRAINT_TYPE: 约束类型(R代表外键,P代表主键,C代表check约束)
TABLE_NAME: 表名称
SEARCH_CONDITION: check约束的具体信息
STATUS: ENABLED表示当前约束是启用的,DISABLED表示当前约束未启用。
2、 查询出表存在哪些约束后,即可以通过alter语句启用或禁用指定的约束了。
如禁用pub_organ表的外键PUBORGAN_FK1,则可以使用如下命令实现:
alter table PUB_ORGAN disable constraint PUBORGAN_FK1
执行后,再次查询字典表user_constraints,如下:
此时往数据库表pub_organ中插入数据时就不再受外键约束的影响了。
启用约束基本语法:
alter table 数据库表名 enable constraint 约束名
如现在需要重新启用pub_organ的外键约束,可以使用如下命令:
alter table PUB_ORGAN enable constraint PUBORGAN_FK1
二、DB2数据库:
禁用约束基本语法:
ALTER TABLE 表名称 ALTER FOREIGN KEY 约束名称 NOT ENFORCED
启用约束基本语法:
ALTER TABLE 表名称 ALTER FOREIGN KEY 约束名称 ENFORCED
相关字典表:SYSIBM.SYSTABCONST
如:select * from SYSIBM.SYSTABCONST where tbname='PUB_ORGAN'
各字段含义如下:
NAME: 约束名称
DEFINER: 定义者
CONSTRAINTTYP: 约束类型(P代表主键,F代表外键)
TBNAME: 表名称
ENFORCED: 是否启用(Y代表启用,N代表未启用)
三、封装成java接口、批量执行
在实际工作中,经常会将若干个表,或者所有数据库表的外键一起禁用,此时需要批量执行相关命令,笔者根据工作实际,使用java封装了相关接口,以方便使用。
对外暴露接口如下:
/*
* 启用当前用户指定tableName的所有外键约束
* 入参使用可变参数(jdk5新特性)
* 调用方式:
* 1、enableFK("pub_organ")
* 2、enableFK("pub_organ","pub_stru")
* 3、enableFK(new String[]{"pub_organ","pub_stru"})
*/
public static void enableFK(String...tableNames){
disableORenbaleFK(true,tableNames)
}
/*
* 禁用当前用户指定tableName的所有外键约束
*/
public static void disableFK(String...tableNames){
disableORenbaleFK(false,tableNames)
}
/*
* 启用当前用户所有表的外键约束
*/
public static void enableAllFK(){
disableORenableAllConstraint(true)
}
/*
* 禁用当前用户所有表的外键约束
*/
public static void disableAllFK(){
disableORenableAllConstraint(false)
}
其中核心处理代码如下:
if(tableNames==null||tableNames.length==0){
throw new RuntimeException("入参tableNames不能为空!")
}
//查询指定表的外键约束
String sql = null
String dbType = getDBType()
if(dbType.contains("ORACLE")){
sql = "select 'alter table ' || table_name || ' disable constraint ' || constraint_name from user_constraints where constraint_type='R' and TABLE_NAME in("
if(isEnable){
sql = sql.replace("disable", "enable")
}
}else if(dbType.contains("DB2")){
sql = "select 'ALTER TABLE ' || TBNAME || ' ALTER FOREIGN KEY ' || NAME ||' NOT ENFORCED ' FROM SYSIBM.SYSTABCONST WHERE CONSTRAINTYP='F' and TBNAME in("
if(isEnable){
sql = sql.replace("NOT ENFORCED", "ENFORCED")
}
}else{
throw new RuntimeException("数据库类型无效(仅支持Oracle和DB2),dbType="+dbType)
}
StringBuffer generateSQL = new StringBuffer(sql)
for(int i=0i<tableNames.lengthi++){
generateSQL.append(" '")
generateSQL.append(tableNames[i].toUpperCase())//注意须转换成大写
generateSQL.append("',")
}
generateSQL.deleteCharAt(generateSQL.length()-1)
generateSQL.append(")")
List<Map<String, Object>>dataSet = DBTool.executeQuery(generateSQL.toString())
//启用or停止查询出的外键约束
for(int i=0i<dataSet.size()i++){
Map<String, Object>record = dataSet.get(i)
Iterator<Entry<String, Object>>itor = record.entrySet().iterator()
while(itor.hasNext())
{
Entry<String, Object>e = itor.next()
DBTool.executeUpdate(e.getValue().toString(),UpdateType.ALTER)
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)