oracle怎么创建外键?

oracle怎么创建外键?,第1张

create TABLE zhao(\x0d\x0a id number primary key,\x0d\x0a mingcheng nvarchar2(50),\x0d\x0a neirong nvarchar2(50),\x0d\x0a jiezhiriqi date,\x0d\x0a zhuangtai nvarchar2(50)\x0d\x0a)\x0d\x0acreate TABLE tou(\x0d\x0a id number primary key,\x0d\x0a zhao_id number,\x0d\x0a toubiaoqiye nvarchar2(50),\x0d\x0a biaoshuneirong nvarchar2(50),\x0d\x0a toubiaoriqi date,\x0d\x0a baojia number,\x0d\x0a zhuangtai nvarchar2(50),\x0d\x0a foreign KEY(zhao_id) REFERENCES zhao(id)\x0d\x0a)\x0d\x0aforeign key (zhao_id) references to zhao(id)\x0d\x0a多了个to

特总结了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)

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/6705652.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-27
下一篇 2023-03-27

发表评论

登录后才能评论

评论列表(0条)

保存