- 浏览: 215336 次
- 性别:
- 来自: 江西
文章分类
- 全部博客 (109)
- C# (29)
- ASP.NET (30)
- MSSQL (29)
- javascript (9)
- cmd (3)
- ORACLE (4)
- log4j (1)
- window (5)
- FTP (1)
- Shell (1)
- java (1)
- IIS (7)
- html (11)
- SQL (3)
- Jquery (11)
- IE (3)
- 火狐、谷歌 (2)
- wince (2)
- JSON (5)
- List (1)
- Foreach (1)
- SQLhelper (1)
- Ajax (1)
- Firebird (1)
- mysql (7)
- js (2)
- jQuery.autocomplete (1)
- dataTable (1)
- Http (1)
- get (1)
- datetime (1)
- powshell (1)
- URL Protocol (1)
- Office (1)
- Excel (1)
- ASP.NET,算法,秘钥 (1)
- 浏览器 (1)
- Tomcat (1)
最新评论
创]外键约束方式 如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表。外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。这里以MySQL为例,总结一下3种外键约束方式的区别和联系。
这里以用户表和用户组表为例,这是一个典型的多对一关系,多个用户对应于一个用户组。
首先创建用户组表:
创建用户组表
create table t_group (
id int not null,
name varchar(30),
primary key (id)
);
并插入两条记录:
插入记录
insert into t_group values (1, 'Group1');
insert into t_group values (2, 'Group2');
下面创建用户表,分别以不同的约束方式创建外键引用关系:
1、级联(cascade)方式
级联方式
create table t_user (
id int not null,
name varchar(30),
groupid int,
primary key (id),
foreign key (groupid) references t_group(id) on delete cascade on update cascade
);
参照完整性测试
insert into t_user values (1, 'qianxin', 1); #可以插入
insert into t_user values (2, 'yiyu', 2); #可以插入
insert into t_user values (3, 'dai', 3); #错误,无法插入,用户组3不存在,与参照完整性约束不符
约束方式测试
insert into t_user values (1, 'qianxin', 1);
insert into t_user values (2, 'yiyu', 2);
insert into t_user values (3, 'dai', 2);
delete from t_group where id=2; #导致t_user中的2、3记录级联删除
update t_group set id=2 where id=1; #导致t_user中的1记录的groupid级联修改为2
2、置空(set null)方式
置空方式
create table t_user (
id int not null,
name varchar(30),
groupid int,
primary key (id),
foreign key (groupid) references t_group(id) on delete set null on update set null
);
参照完整性测试insert into t_user values (1, 'qianxin', 1); #可以插入
insert into t_user values (2, 'yiyu', 2); #可以插入
insert into t_user values (3, 'dai', 3); #错误,无法插入,用户组3不存在,与参照完整性约束不符
约束方式测试
insert into t_user values (1, 'qianxin', 1);
insert into t_user values (2, 'yiyu', 2);
insert into t_user values (3, 'dai', 2);
delete from t_group where id=2; #导致t_user中的2、3记录的groupid被设置为NULL
update t_group set id=2 where id=1; #导致t_user中的1记录的groupid被设置为NULL
3、禁止(no action / restrict)方式
禁止方式
create table t_user (
id int not null,
name varchar(30),
groupid int,
primary key (id),
foreign key (groupid) references t_group(id) on delete no action on update no action
);
参照完整性测试
insert into t_user values (1, 'qianxin', 1); #可以插入
insert into t_user values (2, 'yiyu', 2); #可以插入
insert into t_user values (3, 'dai', 3); #错误,无法插入,用户组3不存在,与参照完整性约束不符
约束方式测试
insert into t_user values (1, 'qianxin', 1);
insert into t_user values (2, 'yiyu', 2);
insert into t_user values (3, 'dai', 2);
delete from t_group where id=2; #错误,从表中有相关引用,因此主表中无法删除
update t_group set id=2 where id=1; #错误,从表中有相关引用,因此主表中无法修改
注:在MySQL中,restrict方式与no action方式作用相同。
这里以用户表和用户组表为例,这是一个典型的多对一关系,多个用户对应于一个用户组。
首先创建用户组表:
创建用户组表
create table t_group (
id int not null,
name varchar(30),
primary key (id)
);
并插入两条记录:
插入记录
insert into t_group values (1, 'Group1');
insert into t_group values (2, 'Group2');
下面创建用户表,分别以不同的约束方式创建外键引用关系:
1、级联(cascade)方式
级联方式
create table t_user (
id int not null,
name varchar(30),
groupid int,
primary key (id),
foreign key (groupid) references t_group(id) on delete cascade on update cascade
);
参照完整性测试
insert into t_user values (1, 'qianxin', 1); #可以插入
insert into t_user values (2, 'yiyu', 2); #可以插入
insert into t_user values (3, 'dai', 3); #错误,无法插入,用户组3不存在,与参照完整性约束不符
约束方式测试
insert into t_user values (1, 'qianxin', 1);
insert into t_user values (2, 'yiyu', 2);
insert into t_user values (3, 'dai', 2);
delete from t_group where id=2; #导致t_user中的2、3记录级联删除
update t_group set id=2 where id=1; #导致t_user中的1记录的groupid级联修改为2
2、置空(set null)方式
置空方式
create table t_user (
id int not null,
name varchar(30),
groupid int,
primary key (id),
foreign key (groupid) references t_group(id) on delete set null on update set null
);
参照完整性测试insert into t_user values (1, 'qianxin', 1); #可以插入
insert into t_user values (2, 'yiyu', 2); #可以插入
insert into t_user values (3, 'dai', 3); #错误,无法插入,用户组3不存在,与参照完整性约束不符
约束方式测试
insert into t_user values (1, 'qianxin', 1);
insert into t_user values (2, 'yiyu', 2);
insert into t_user values (3, 'dai', 2);
delete from t_group where id=2; #导致t_user中的2、3记录的groupid被设置为NULL
update t_group set id=2 where id=1; #导致t_user中的1记录的groupid被设置为NULL
3、禁止(no action / restrict)方式
禁止方式
create table t_user (
id int not null,
name varchar(30),
groupid int,
primary key (id),
foreign key (groupid) references t_group(id) on delete no action on update no action
);
参照完整性测试
insert into t_user values (1, 'qianxin', 1); #可以插入
insert into t_user values (2, 'yiyu', 2); #可以插入
insert into t_user values (3, 'dai', 3); #错误,无法插入,用户组3不存在,与参照完整性约束不符
约束方式测试
insert into t_user values (1, 'qianxin', 1);
insert into t_user values (2, 'yiyu', 2);
insert into t_user values (3, 'dai', 2);
delete from t_group where id=2; #错误,从表中有相关引用,因此主表中无法删除
update t_group set id=2 where id=1; #错误,从表中有相关引用,因此主表中无法修改
注:在MySQL中,restrict方式与no action方式作用相同。
发表评论
-
用一条insert语句来插入多行数据
2016-05-23 10:35 1749oracle、sqlserver不支持inse ... -
关于distinct 和group by的去重逻辑浅析
2016-05-20 11:06 974在数据库操作中,我们常常遇到需要将数据去重计数的工作。例如: ... -
mysql和mssql关键字key的转义
2016-05-20 10:30 786mysql反引号``,它在键盘的~这个键上,SqlServer ... -
SQL几种分页语句性能对比
2014-03-07 10:35 485SET STATISTICS IO ON select * ... -
MSQL2005以上对象名sysproperties 无效的错误
2014-03-03 11:59 1415在MSSQL2008R2里面执行的时候报错:对象名syspro ... -
IN和EXISTS性能上的区别
2014-02-24 16:46 817在外表大内部小的情况下,EXISTS性能比IN快,如果两个表的 ... -
SQL Server 2000 ——系统表和系统视图
2014-02-17 10:26 1204一、一般存储过程 1、 ... -
新增链接服务器
2014-02-17 10:19 780新增链接服务器 if exists (select * fro ... -
在MSSQL2000里面 对象名 'sys.servers' 无效 服务器: 消息 208,级别 16,状态 1,行 1
2014-02-17 10:12 3200在MSSQL2000里面不支持该 sys.servers查看 ... -
SQL SERVER2008数据库中创建和删除链接服务器
2014-02-11 13:43 5020--在SQL SERVER 2008里,可以按以下的方式建立链 ... -
SQL Server获取某月某季某年最后一天的SQL语
2013-11-25 20:26 1398项目中用到的,获取已知年份的第一天和最后一天,觉得网来的不错, ... -
SQL IO、性能
2013-08-30 09:04 997转载地址:http://blog.csdn.n ... -
sql中两个日期相减
2013-08-21 13:36 8996sql中两个日期相减 1、相差天数 select trun ... -
SET STATISTICS IO ON和获取表中的所有行
2013-08-14 11:58 697SET STATISTICS IO ON --通过来查看扫描 ... -
SQL CAST和CONVERT区别
2013-08-09 09:06 697一种数据类型的表达式转换为另一种数据类型的表达式。 CAS ... -
图表处理程序配置 [c:\TempImageFiles\] 中的临时目录无效
2013-07-24 11:15 3704图表处理程序配置 [c:\TempImageFiles\] 中 ... -
MS-SQL2005以上的版本解决Syscolumn表中数据不能修改
2013-07-06 11:41 588例如: 在MSSQL2000里面可以获取到相应的数据 获取Tr ... -
asp.net 在webcofig中连接数据库方式
2013-07-02 14:38 7501:window方式验证 <connectionStri ... -
解决用户 'IIS APPPOOL\Classic .NET AppPool' 登录失败 windows 7
2013-07-02 14:31 1134进入iis管理器 本地应用程序池 选中classic. net ... -
分页效果
2013-05-20 19:19 890转载http://jianfulove.iteye.com/b ...
相关推荐
数据库外键约束方式 外键约束是数据库中实现参照完整性的重要手段,它能够确保数据的一致性和正确性。外键约束方式有多种,包括级联、置空和禁止三种方式。 级联(Cascade)方式是指当主表中的记录被删除或更新时...
在数据库管理中,外键约束是关系数据库设计中的一个重要概念,用于维护数据的一致性和完整性。外键约束确保了引用的完整性,即一个表中的外键值必须是另一个表中存在的主键值。在进行大规模数据导入、更新或者调试时...
本文将详细介绍MySQL中三种外键约束方式:级联(cascade)、置空(set null)和禁止(no action或restrict),并通过实例来展示它们在数据操作时的行为差异。 1. **级联(cascade)方式** 在级联约束中,当主表中...
因此,通过程序化的方式对主表和子表进行排序,可以确保在插入时满足外键约束,提高导入数据的效率。 在提供的文件中,我们可以看到以下几个关键组件: 1. **GetMessage.java**:这可能是负责从源数据库获取数据并...
下面将详细阐述外键约束的基本原理、作用及其实现方式。 首先,外键(Foreign Key)是数据库表中的一种字段,它引用了另一个表的主键(Primary Key),从而建立了两个表之间的关联。这种关联使得一个表的数据能够...
通过这种方式,外键约束确保了子表中的数据引用父表中有效的记录,防止了非法数据的插入,从而保持了数据的准确性。 外键约束的主要功能包括: 1. **数据完整性**:外键约束强制了参照完整性,不允许子表中出现父...
MySQL外键约束是数据库设计中的一个重要概念,它用于在两个表之间建立联系,确保数据的一致性和完整性。外键约束的使用确保了当一个表(父表)中的数据发生更改时,与其关联的另一个表(子表)的相关数据也会相应...
MySQL中的外键约束是数据库设计中用于维护数据完整性和参照完整性的关键机制,特别是在关系数据库中。外键约束确保了在一个表中的数据(子表)与另一个表(父表)中的数据之间的关联性。在MySQL中,外键约束主要用于...
级联删除和级联更新是数据库管理中非常重要的概念,特别是在多表关联的情况下,能够确保数据的一致性和完整性。...而外键约束方式则更加简洁明了,易于维护。具体选择哪种方式取决于实际应用场景的需求和个人偏好。
在Oracle数据库中,外键约束是确保数据完整性和一致性的重要机制。它定义了一个表中的一个或多个列(称为外键)的值必须匹配另一个表(称为参照表)中某些行的值,以此来维护两个表之间的关系。这有助于保证两个表...
在Laravel 5.6框架中,实现数据库表的外键约束是一种确保数据完整性和依赖关系的有效方式。外键约束是数据库管理系统中的一种机制,它用于在两个表的列之间创建链接。主表中的列被称为主键,而外键表中的列则被称为...
通过这种方式,你可以在MySQL中安全且便捷地删除存在外键约束的表,无需关心它们之间的依赖关系。但请务必谨慎操作,因为这可能会导致数据丢失,特别是在生产环境中。在进行此类操作时,最好先备份你的数据,确保有...
为了实现这一目标,数据库管理系统提供了各种约束机制,如主键约束、外键约束、唯一性约束和检查约束等。在《数据库技术与应用》这门课程中,学生将学习如何使用SQL语言中的ALTER语句来对已存在的表进行修改,特别是...
这段代码展示了如何查询特定表(此处为“Ҫд”)的外键关联表信息,通过`p.OWNER`和`c.OWNER`确保查询的是当前用户的表,并通过`p.table_name`指定表名,通过`c.constraint_type='R'`筛选出外键约束。 2. **查询...
在使用ALTER TABLE语句时,如果需要删除已经存在的外键,不能直接使用DROP FOREIGN KEY,而要先通过SHOW CREATE TABLE查看外键的确切名称,然后使用ALTER TABLE语句配合DROP FOREIGN KEY命令来删除指定的外键约束。...
259 12.3.2 使用表设计器定义主键约束 260 12.3.3 使用T-SQL定义主键约束 261 12.4 外键约束 262 12.4.1 一个外键约束的示例 262 12.4.2 使用表设计器定义外键约束 263 12.4.3 使用T-SQL定义外键...
在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作转换为面向对象的方式,从而简化了数据访问层的开发。"hibernate基于主外键的一对多/多对一关联"是Hibernate中两个核心...
MySQL外键创建失败,往往是因为多种原因导致的,其中最常见的错误代码是1005。以下将详细解析这些原因,并提供相应...同时,学习和理解MySQL的外键约束原理以及InnoDB存储引擎的工作方式,对于解决这类问题非常有帮助。
2. **外键约束**:定义外键的同时,通常会添加外键约束,以确保插入或更新数据时遵循关联规则。例如,在MySQL中,可以使用`FOREIGN KEY`关键字来定义外键约束。 3. **级联操作**:外键可以配置为支持级联操作,如`...