数据库外键约束(数据库定义外键约束的语句)

网站建设定制 226
今天给各位分享数据库外键约束的知识,其中也会对数据库定义外键约束的语句进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!数据库中的外键是什么意思? 外键(FK)是用于建立和加强两个表数据之间的链接的一列或多列。通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就成为第二个表的外键。当创建或更改表时可通过定义 FOREIGN KEY 约束来创建外键。

今天给各位分享数据库外键约束的知识,其中也会对数据库定义外键约束的语句进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

数据库中的外键是什么意思?

外键(FK)是用于建立和加强两个表数据之间的链接的一列或多列。通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就成为第二个表的外键。

当创建或更改表时可通过定义 FOREIGN KEY 约束来创建外键。

例如,数据库 pubs 中的 titles 表与 publishers 表有链接,因为在书名和出版商之间存在逻辑联系。

titles 表中的 pub_id 列与 publishers 表中的主键列相对应。titles 表中的 pub_id 列是到 publishers 表的外键。

扩展资料:

保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值或使用空值。

学号在成绩表(表2)中是主键,在学生表(表1)中是外键。如果不使用外键,表1的学号字段插了一个值(比如20140999999),但是这个值在表2中并没有,这个时候,数据库允许插入,并不会对插入的数据做关系检查。

然而在设置外键的情况下,插入表1学号字段的值必须要求在表1的学号字段能找到。 同时,如果要删除表2的某个学号字段,必须保证表2中没有引用该字段值的列,否则就没法删除。

这就是所谓的保持数据的一致性和完整性。如右图,如果表1还引用表2的某个学号,却把表1中的这个学号删了,表2就不知道这个学号对应的学生是哪个学生。

参考资料:百度百科-外键

数据库中的外键约束

外键是该表是另一个表之间联接的字段

外键必须为另一个表中的主键

外键的用途是确保数据的完整性。它通常包括以下几种:

实体完整性,确保每个实体是唯一的(通过主键来实施)

域完整性,确保属性值只从一套特定可选的集合里选择

关联完整性,确保每个外键或是NULL(如果允许的话)或含有与相关主键值相配的值

例子:

表A 字典表, 表B 业务表。

外键应建立在表B 上 。

1、表B 的字典项目的代码只能是表A 中代码内容。

2、表B 可以无条件删除记录。

3、表A 在删除的时候,将根据外键的规则,判断表B 中是否使用了要删除数据的代码,如果有引用,则不能删除。

ORACLE 如何建立表外键

例:学生表student (id, name , sex )

成绩表score (id ,math )

如何创建表,要求 有主键,有约束 解: CREATE TABLE STUDENT(ID CHAR(10), NAME VARCHAR(8),SEX CHAR(1));

ALTER TABLE STUDENT ADD CONSTRAINT PK_STUDENT PRIMARY KEY(ID);

CREATE TABLE SCORE( ID CHAR(10),MATH NUMBER(5,2));

ALTER TABLE SCORE ADD CONSTRAINT FK_SCROE FOREIGN KEY(ID) REFERENCES STUDENT(ID);

* 主键与外键: 键是表中的列(可以是一列,也可以是几列),主键用于唯一的标识表中的数据项;外键用于连接父表和子表。而所谓的父表和子表是根据3NF 范式的要求,为了消除传递依赖,将原表拆成2个相互关联的表,而这个关联就是外键。

如何启用和禁用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"}) */ publicstaticvoidenableFK(String...tableNames){ disableORenbaleFK(true,tableNames); }/* * 禁用当前用户指定tableName的所有外键约束 */ publicstaticvoiddisableFK(String...tableNames){ disableORenbaleFK(false,tableNames); }/* * 启用当前用户所有表的外键约束 */ publicstaticvoid enableAllFK(){ disableORenableAllConstraint(true); } /* * 禁用当前用户所有表的外键约束 */ publicstaticvoid disableAllFK(){ disableORenableAllConstraint(false); } 其中核心处理代码如下: if(tableNames==null||tableNames.length==0){ thrownew 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"); } }elseif(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{ thrownew RuntimeException("数据库类型无效(仅支持Oracle和DB2),dbType="+dbType); } StringBuffer generateSQL = new StringBuffer(sql); for(int i=0;i

数据库外键约束问题

1、如果外键关系存在的话,你的想法就不能实现,因为字表的数据一定要在父表中存在(这是外键起的作用),反过来讲父表中没有的数据在字表中一定不存在,你也插入不进去。

2、所以,如果想达到你的目的,删掉这个外键后再弄。

---

以上,希望对你有所帮助。

如何启用和禁用oracle&DB2数据库外键约束

特总结了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=0;itableNames.length;i++){

generateSQL.append(" '");

generateSQL.append(tableNames[i].toUpperCase());//注意须转换成大写

generateSQL.append("',");

}

generateSQL.deleteCharAt(generateSQL.length()-1);

generateSQL.append(")");

ListMapString, Object dataSet = DBTool.executeQuery(generateSQL.toString());

//启用or停止查询出的外键约束

for(int i=0;idataSet.size();i++){

MapString, Object record = dataSet.get(i);

IteratorEntryString, Object itor = record.entrySet().iterator();

while(itor.hasNext())

{

EntryString, Object e = itor.next();

DBTool.executeUpdate(e.getValue().toString(),UpdateType.ALTER);

}

}

数据库外键约束的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于数据库定义外键约束的语句、数据库外键约束的信息别忘了在本站进行查找喔。

数据库外键约束 数据库外键约束怎么写数据库外键约束的作用数据库外键约束怎么设置数据库外键约束失败是什么原因数据库外键约束代码数据库外键约束失败添加不了数据库外键约束怎么删除数据库外键约束名怎么写数据库外键约束的关键字数据库添加外键约束
扫码二维码