在数据库中的外键与主键的关系是什么,为什么要设外键?

在数据库中的外键与主键的关系是什么,为什么要设外键?,第1张

1、外键的概念:外键是关系数据库三个完整性的五个约束条件之一,是表与表之间建立的一种关系。在Oracle数据库的scott/tiger用户中,表Dept和Emp通过外键进行了关联。在这里Dept表叫主表,Emp表叫从表,外键是字段Deptno。\x0d\2、加入外键的条件:a、两个表有相同属性字段,取值范围相同;\x0d\ b、外键在主表中是主键或者是唯一字段;\x0d\ c、外键可以是多个字段的组合。\x0d\ 记住一句话:从表的外键是主表的主键或唯一字段。

ACCESS数据库设置数据表外键可以通过SQL数据定义查询和手动设置表间参照完整性两种方式予以实现。

注意设置外键前一方表的关联字段必须是主键或建有唯一索引,下面举例示范这两种设置方法。假设两张数据表的结构如下:

课程(课程ID 文本 主键,课程)

成绩(学号,课程ID,分数)

1)运行SQL数据定义查询

ALTER TABLE 成绩 ADD CONSTRAINT MyRelation1 FOREIGN KEY (课程ID) 
REFERENCES 课程 (课程ID);

2)手动建立两表一对多参照完整性

于表对象——右键 打开表关系视图,将要建立关系的表显示到关系视图里

拖动一方主表里的关联字段到多方表里。于d出的编辑关系对话框,选择各表对应的关联字段,勾选实施参照完整性选项后,点击创建(或确定)按钮即可,这样系统就会自动建立相应的外键了。

参见附图(此为ACCESS2003图例,其他版本类似)

注意建立外键时,若数据表里存在违反外键约束的记录,创建外键将会报错,只有删除了违反外键约束的有关记录后才能顺利完成外键的设置。

附带简介一下外键 (FOREIGN KEY) ,它是用于在两个表中的数据之间建立和加强链接的一列或多列的组合,可控制可在外键表中存储的数据。 在外键引用中,当包含一个表的主键值的一个或多个列被另一个表中的一个或多个列引用时,就在这两个表之间创建了链接。 这个列就成为第二个表的外键。

数据库mysql
建立外键的前提:
本表的列必须与外键类型相同(外键必须是外表主键)。
外键作用:
使两张表形成关联,外键只能引用外表中的列的值!
指定主键关键字:
foreign
key(列名)
引用外键关键字:
references
<外键表名>(外键列名)
事件触发限制:
on
delete和on
update
,
可设参数cascade(跟随外键改动),
restrict(限制外表中的外键改动),set
Null(设空值),set
Default(设默认值),[默认]no
action
例如:
outTable表
主键
id
类型
int
创建含有外键的表:
create
table
temp(
id
int,
name
char(20),
foreign
key(id)
references
outTable(id)
on
delete
cascade
on
update
cascade);
说明:把id列
设为外键
参照外表outTable的id列
当外键的值删除
本表中对应的列筛除
当外键的值改变
本表中对应的列值改变。
自己实践
才能完全了解外键的作用
关键是:事件触发限制的作用

一张表中的主键只能有一个,外键可以有多个,如果一张表中多个列都需要被别的表的外键参考,需要使用候选码(非空并且唯一),具体到你的这个问题的需求可以考虑用如下方法解决:

把a表中的bookid和authorid都设置为非空并且唯一,即

create table a(bookid int not null unique, authorid int not null unique);

然后在book表和author表中就可以分别设置外键来参照a表中两个不同的字段了。

打开我的navicat,然后找到我的teacher表,选中它,然后点击菜单栏上的‘design table'

2 在d出的对话框中找到“Foreign Keys”,然后单机。

3 然后会出现一个设置外键的界面,一共有七列。简单介绍一下这几列的意思。‘name’:可以不填,你一会保存成功系统会自动生成。FieldName’:就是你要把哪个键设置为外键。这里选择‘dept’,‘Reference DadaBase’:外键关联的数据库。‘Reference Table‘ :关联的表 这里是dept表‘Forgin filed Names’:关联的的字段,这里是code‘ondelete’:就是删除的时候选择的动作。这里我的选择是setNull,意思就是当关联的表删除以后,teacher》dept字段会设置为null

4 设置完成后点击‘save’保存退出,也可以点击‘add Foreign Key’再添加一个外键。

打开我的navicat,然后找到我的teacher表,选中它,然后点击菜单栏上的‘design table’。如下图:

2 在d出的对话框中找到“Foreign Keys”,然后单机。如下图:

3 然后会出现一个设置外键的界面,一共有七列。简单介绍一下这几列的意思。‘name’:可以不填,你一会保存成功系统会自动生成。FieldName’:就是你要把哪个键设置为外键。这里选择‘dept’,‘Reference DadaBase’:外键关联的数据库。‘Reference Table‘ :关联的表 这里是dept表‘Forgin filed Names’:关联的的字段,这里是code‘ondelete’:就是删除的时候选择的动作。这里我的选择是setNull,意思就是当关联的表删除以后,teacher》dept字段会设置为null。如图

4 设置完成后点击‘save’保存退出,也可以点击‘add Foreign Key’再添加一个外键。k如图:

应该是可以在sql
server2000的企业管理器里面直接 *** 作添加外键的。
应该在一个表的设计界面,选中一行,点鼠标右键,选关系,然后选外键。
好久没有用2000了,呵`~不是很记得,lz多试两下就出来了`~
alter
table
表名
add
constraint
外键名称
foreign
key
(外键)
references[主键表名](引用列),

1312 ALTER TABLE语法
ALTER [IGNORE] TABLE tbl_name
alter_specification [, alter_specification]
alter_specification:
ADD [COLUMN] column_definition [FIRST | AFTER col_name ]
| ADD [COLUMN] (column_definition,)
| ADD INDEX [index_name] [index_type] (index_col_name,)
| ADD [CONSTRAINT [symbol]]
PRIMARY KEY [index_type] (index_col_name,)
| ADD [CONSTRAINT [symbol]]
UNIQUE [index_name] [index_type] (index_col_name,)
| ADD [FULLTEXT|SPATIAL] [index_name] (index_col_name,)
| ADD [CONSTRAINT [symbol]]
FOREIGN KEY [index_name] (index_col_name,)
[reference_definition]
| ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
| CHANGE [COLUMN] old_col_name column_definition
[FIRST|AFTER col_name]
| MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]
| DROP [COLUMN] col_name
| DROP PRIMARY KEY
| DROP INDEX index_name
| DROP FOREIGN KEY fk_symbol
| DISABLE KEYS
| ENABLE KEYS
| RENAME [TO] new_tbl_name
| ORDER BY col_name
| CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
| [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name]
| DISCARD TABLESPACE
| IMPORT TABLESPACE
| table_options
| partition_options
| ADD PARTITION partition_definition
| DROP PARTITION partition_names
| COALESCE PARTITION number
| REORGANIZE PARTITION partition_names INTO (partition_definitions)
| ANALYZE PARTITION partition_names
| CHECK PARTITION partition_names
| OPTIMIZE PARTITION partition_names
| REBUILD PARTITION partition_names
| REPAIR PARTITION partition_names
PRIMARY KEY 和 FOREIGN KEY
自己看手册,丰衣足食

sqlserver中建立外键约束有3中方式:enterprisemanager中,tables,designtable,设置table的properties,可以建立constraint,referencekey;enterprisemanager中,diagrams,newdiagrams,建立两个表的关系;直接用transactsql语句。

1、三个方法都需要先建立数据表。

1)创建表author:

createtable[dbo][author](

[id][bigint]notnull,[authorname][char](10)null,[address][char](480)null,[introction][ntext]null

)

2)创建表mybbs:

reatetable[dbo][mybbs](

[id][bigint]identity(1,1)notnull,[authorid][bigint]notnull,[title][char](40)null,[date_of_created][datetime]null,[abstract][char](480)null,[content][ntext]null

)

2、设置表mybbs中的authorid为外键,参照author表的id字段,直接使用transactsql语句,过程如下:

1)增加表mybbs(authorid)的外键约束fk_mybbs_author,表mybbs中的authorid受表author中的主键id约束:

begintransaction

altertabledbomybbsaddconstraintfk_mybbs_author

foreignkey(authorid)

referencesdboauthor([id])onupdatecascadeondeletecascade

2)删除外键约束fk_mybbs_author:

--altertabledbomybbsdropconstraintfk_mybbs_author

--rollback

committransaction

上面onupdatecascade,ondeletecascade两个选项,指明以后author表的id字段有delete,update *** 作时,mybbs表中的id也会被级联删除或更新。如果没有选中,是不可以对author表中已被mybbs表关联的id进行update或者delete *** 作的。

SQL的主键和外键的作用:

1、插入非空值时,如果主键表中没有这个值,则不能插入。

2、更新时,不能改为主键表中没有的值。

3、删除主键表记录时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除。

4、更新主键记录时,同样有级联更新和拒绝执行的选择。

简而言之,SQL的主键和外键就是起约束作用。

mysql添加外键:
为已经添加好的数据表添加外键:
语法:alter table 表名 add constraint FK_ID foreign key(你的外键字段名) REFERENCES 外表表名(对应的表的主键字段名);
例: alter table tb_active add constraint FK_ID foreign key(user_id) REFERENCES tb_user(id)
//FK_ID是外键的名称
/
CREATE TABLE `tb_active` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`content` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`user_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `user_id_2` (`user_id`),
CONSTRAINT `FK_ID` FOREIGN KEY (`user_id`) REFERENCES `tb_user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
/


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

原文地址: https://outofmemory.cn/yw/13017770.html

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

发表评论

登录后才能评论

评论列表(0条)

保存