主键和外键的区别
- 格式:doc
- 大小:20.50 KB
- 文档页数:1
数据库的几个概念:主键,外键,索引,唯一索引主键:主键是数据表的唯一索引,比如学生表里有学号和姓名,姓名可能有重名的,但学号确是唯一的,你要从学生表中搜索一条纪录如查找一个人,就只能根据学号去查找,这才能找出唯一的一个,这就是主键;如:id int(10) not null primary key auto_increment ;自增长的类型;外键:定义数据表假如某个电脑生产商,它的数据库中保存着整机和配件的产品信息。
用来保存整机产品信息的表叫做 Pc;用来保存配件供货信息的表叫做Parts。
在Pc表中有一个字段,用来描述这款电脑所使用的CPU型号;在Parts 表中相应有一个字段,描述的正是CPU的型号,我们可以把它想成是全部CPU的型号列表。
很显然,这个厂家生产的电脑,其使用的CPU一定是供货信息表(parts)中存在的型号。
这时,两个表中就存在一种约束关系(constraint)——Pc表中的CPU型号受到Parts 表中型号的约束。
首先我们来创建 parts 表:CREATE TABLE parts (... 字段定义 ...,model VARCHAR(20) NOT NULL,... 字段定义 ...);接下来是Pc表:CREATE TABLE pc (... 字段定义 ...,cpumodel VARCHAR(20) NOT NULL,... 字段定义 ...};设置索引若要设置外键,在参照表(referencing table,即Pc表) 和被参照表(referenced table,即parts表) 中,相对应的两个字段必须都设置索引(index)。
对Parts表:ALTER TABLE parts ADD INDEX idx_model (model);这句话的意思是,为 parts 表增加一个索引,索引建立在 model 字段上,给这个索引起个名字叫idx_model。
对Pc表也类似:ALTER TABLE pc ADD INDEX idx_cpumodel (cpumodel);事实上这两个索引可以在创建表的时候就设置。
MySQL主键和外键设计原则和实践在数据库设计中,主键和外键是两个非常重要的概念。
它们不仅可以用来保证数据的完整性,还可以提高数据库的性能和查询效率。
本文将介绍MySQL主键和外键的设计原则和实践,帮助读者更好地理解和应用这两个概念。
1. 主键的定义和作用主键是一列或一组列,其值用于唯一标识数据库表中的每一行数据。
主键具有以下作用:1.1 唯一性约束:主键的值在整个表中必须是唯一的,用于区分不同的数据行。
1.2 非空约束:主键的值不能为NULL,确保每一行都有一个有效的标识。
1.3 快速查询:主键通常会被用作索引,可以提高查询的效率。
2. 主键的选择选择适合的主键是一个关键的设计决策。
以下是几个常见的主键选择:2.1 单列主键:在表中选择一个唯一的列作为主键,通常是自增长的整数列。
这种选择简单和高效,但在分布式环境中可能存在性能问题。
2.2 复合主键:在表中选择多个列作为主键,结合这些列的值可以唯一标识数据行。
这种选择适用于需要联合索引的情况,但也增加了数据库的复杂性。
2.3 外部主键:引用其他表中的列作为主键。
这种选择可以建立表与表之间的关联,但也需要额外的管理和维护工作。
3. 外键的定义和作用外键是一列或一组列,其值用于建立表与表之间的关联。
外键具有以下作用:3.1 关联表之间的数据:通过外键可以建立表与表之间的联系,实现数据的引用和关联。
3.2 维护数据的完整性:外键可以强制保证关联表中的数据的完整性,确保数据的一致性和准确性。
3.3 改善查询性能:外键可以作为索引,提高查询的效率。
4. 外键的设计原则在设计外键时,应遵循以下原则来确保数据库表的结构合理和高效:4.1 唯一性约束:外键的值在引用表中必须是唯一的,有助于避免数据的冗余和不一致。
4.2 对应关系:外键的值必须与被引用表的主键值相对应,确保数据的一致性。
4.3 级联操作:对于涉及到关联表的插入、更新和删除操作,可以设置级联操作规则来保持数据的一致性和完整性。
主键与外键一、什么是主键、外键:关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键比如学生表(学号,姓名,性别,班级)其中每个学生的学号是唯一的,学号就是一个主键课程表(课程编号,课程名,学分)其中课程编号是唯一的,课程编号就是一个主键成绩表(学号,课程号,成绩)成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以学号和课程号的属性组是一个主键成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学生表的主键,则称成绩表中的学号是学生表的外键同理成绩表中的课程号是课程表的外键定义主键和外键主要是为了维护关系数据库的完整性,总结一下:主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。
身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。
外键用于与另一张表的关联。
是能确定另一张表记录的字段,用于保持数据的一致性。
比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。
二、主键、外键和索引的区别收藏聚集索引和非聚集索引的区别?聚集索引一定是唯一索引。
但唯一索引不一定是聚集索引。
聚集索引,在索引页里直接存放数据,而非聚集索引在索引页里存放的是索引,这些索引指向专门的数据页的数据。
三、数据库中主键和外键的设计原则主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。
主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。
必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。
而主键和外键的结构是这个设计过程的症结所在。
一旦将所设计的数据库用于了生产环境,就很难对这些键进行修改,所以在开发阶段就设计好主键和外键就是非常必要和值得的。
主键:关系数据库依赖于主键---它是数据库物理模式的基石。
主键在物理层面上只有两个用途:1. 惟一地标识一行。
主键和外键的作用1.主键的作用:主键是一种用于唯一标识表中每一行记录的字段或字段组合。
主键具有以下几个作用:1.1唯一标识记录:主键字段的值在表中必须是唯一的,不可重复。
通过主键,可以在表中快速准确地定位和识别特定的记录。
1.2确保数据完整性:主键的存在可以确保数据的完整性。
每一行记录都必须有一个主键值,如果一些记录没有主键值,则违反了数据完整性的原则。
主键可以避免数据的冗余和重复,保证数据的一致性。
1.3帮助建立表之间的关系:主键可以用来建立表与表之间的关联关系。
在多表查询或者数据检索时,可以通过主键关联两个或多个表的记录,实现表之间的数据一致性和准确性。
1.4作为外键的参照对象:主键可以被其他表中的字段引用作为外键,用于建立表之间的关联关系。
在外键关系中,主键扮演着被引用的角色,提供数据一致性和数据完整性的保证。
2.外键的作用:外键是一种存在于一个表中,但是指向其他表中主键的字段。
外键的作用如下:2.1建立表之间的关系:外键可以用来建立表与表之间的关联关系。
通过外键,可以将多个表中的数据关联起来,为数据库的设计提供了一种有效的方式。
2.2提供数据一致性和完整性的保证:通过外键,在多表操作或者数据检索时,可以确保数据的一致性和完整性。
外键可以限制在一个表中插入、更新或删除数据的操作,保证了数据的准确性和一致性。
2.3实现数据级联操作:外键可以实现数据级联操作。
当主表中的记录被删除或者更新时,通过外键的约束关系,会自动触发对应的从表中的记录的删除或更新操作,保证数据的完整性和一致性。
2.4处理表之间的关系:外键可以处理表之间的关系,如一对多关系、多对多关系等。
通过外键,可以实现表之间的连接、关联和查询,提供了数据的灵活性和可扩展性。
综上所述,主键和外键在关系数据库中发挥着重要的作用,不仅可以确保数据的完整性和一致性,还可以建立表与表之间的关联关系。
主键用于唯一标识记录,保证数据的完整性和准确性,同时用作外键的参照对象。
MySQL的主键与外键使用技巧MySQL是一个开源的关系型数据库管理系统,被广泛应用于各种Web应用程序中。
在数据库设计和优化中,主键和外键是两个重要的概念。
主键是用来唯一标识表中的每一行数据的字段,而外键则用于建立表与表之间的关联关系。
本文将探讨MySQL中主键和外键的使用技巧,以帮助读者更好地理解和应用它们。
1. 主键的定义和作用主键是表中的一列,用于唯一标识表中的每一行数据。
它的值不能重复且不能为空。
主键有助于提高数据的检索效率,因为数据库可以通过主键来快速定位和访问指定的数据行。
在MySQL中,可以使用关键字PRIMARY KEY来定义主键。
一般来说,主键最好是一个自增的整数类型,如INT或BIGINT。
这是因为自增主键的值是按照一定的规律自动生成的,不容易与其他数据行发生冲突。
2. 主键的选择和设计在选择主键时,应该考虑以下几个方面:a) 唯一性:主键的值在整个表中是唯一的,能够明确地标识一条数据行。
b) 稳定性:主键的值是不变的,不会受到业务逻辑变动或数据更新的影响。
c) 简洁性:主键的类型和长度应尽量简洁,这有助于提高数据库的性能和节省存储空间。
在设计主键时,还可以考虑以下几种方式:a) 单一字段主键:选择表中的某个字段作为主键,如用户表中的用户ID字段。
这种方式简单直观,但在一些特殊情况下可能不适用,比如需要联合多个字段来唯一标识一条数据行。
b) 自增主键:使用一个自增的整数类型字段作为主键,如订单表中的订单ID字段。
这种方式方便快捷,且可以很好地支持数据的插入和检索。
c) UUID主键:使用一个全局唯一标识符(UUID)作为主键,如图书表中的图书ID字段。
UUID是一个128位的数字,具有极低的重复概率,适用于分布式系统和高并发场景。
3. 外键的定义和作用外键是用于建立表与表之间关联关系的字段。
它可以将一个表中的数据行与另一个表中的数据行进行关联。
外键有助于确保数据的完整性和一致性,因为数据库可以通过外键来检查和约束数据的插入和更新操作。
外键和相应的主键之间的关系
外键一定是另外某个表的主键。
1.能够唯一表示数据表中的每个记录的字段或者字段的组合称为主键,一个主键是唯一识别一个表的每一行记录,但这只是其作用的一部分。
2.主键的主要作用是将记录和存放在其他表中的数据进行关联,在这一点上,主键是不同表中各记录间的简单指针,主键约整就是确定表中的每一条记录。
3.主键不能是空值,唯一约束是用于指定一个或多个列的组合值具有唯一性,以防止在列中输入重复的值,所以,主键的值对用户而言是没有什么意义。
4.若有两个表A,B,C是A的主键,而B中也有C字段,则C就是表B的外键,外键约束主要用来维护两个表之间数据的一致性。
5.在数据库中,常常不只是一个表,这些表之间也不是相互独立的,不同的表之间需要建立一种关系,才能将它们的数据相互沟通。
MySQL中主键与外键的区别和联系与外键的关系,通俗点⼉讲,我现在有⼀个论坛,有两张表,⼀张是主贴 thread,⼀张是回帖 reply先说说主键,主键是表⾥⾯唯⼀识别记录的字段,⼀般是帖⼦id,体现在访问的时候,例如是thread.php?id=1 表⽰我要访问的是帖⼦id是1 的帖⼦~再来说说,当我们删除某个帖⼦的时候,需要执⾏另⼀个操作,就是删除所有回帖,如果正常情况下,我们需要执⾏两次delete操作(thread和 reply),这时候如果存在外键,例如,在reply 表⾥⾯建⽴⼀个指向thread表的主键(id)的外键(这个外键绑的字段,必须是对应帖⼦的id),并指定响应 delete ,那你在删除 thread 的时候,mysql ⾃⼰会帮你把 reply 表中这个帖⼦的回复都删掉,⽽不需要你⼿动再去执⾏⼀次reply表的delete操作~⾄于两者之间的关系,在刚才的例⼦中,reply 表的外键,指向的就是 thread 表的主键~~搞个例⼦,简单演⽰⼀下使⽤,做dage和xiaodi两个表,⼤哥表是主键,⼩弟表是外键:建表:CREATE TABLE `dage` (`id` int(11) NOT NULL auto_increment,`name` varchar(32) default '',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;CREATE TABLE `xiaodi` (`id` int(11) NOT NULL auto_increment,`dage_id` int(11) default NULL,`name` varchar(32) default '',PRIMARY KEY (`id`),KEY `dage_id` (`dage_id`),CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;插⼊个⼤哥:mysql> insert into dage(name) values('铜锣湾');Query OK, 1 row affected (0.01 sec)mysql> select * from dage;+----+--------+| id | name |+----+--------+| 1 | 铜锣湾 |+----+--------+1 row in set (0.00 sec)插⼊个⼩弟:mysql> insert into xiaodi(dage_id,name) values(1,'铜锣湾_⼩弟A');Query OK, 1 row affected (0.02 sec)mysql> select * from xiaodi;+----+---------+--------------+| id | dage_id | name |+----+---------+--------------+| 1 | 1 | 铜锣湾_⼩弟A |+----+---------+--------------+把⼤哥删除:mysql> delete from dage where id=1;ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`bstar/xiaodi`, CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`))提⽰:不⾏呀,有约束的,⼤哥下⾯还有⼩弟,可不能扔下我们不管呀!插⼊⼀个新的⼩弟:mysql> insert into xiaodi(dage_id,name) values(2,'旺⾓_⼩弟A');2ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`bstar/xiaodi`, CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`))提⽰:⼩⼦,想造反呀!你还没⼤哥呢!把外键约束增加事件触发限制:mysql> show create table xiaodi;CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`)mysql> alter table xiaodi drop foreign key xiaodi_ibfk_1;Query OK, 1 row affected (0.04 sec)Records: 1 Duplicates: 0 Warnings:mysql> alter table xiaodi add foreign key(dage_id) references dage(id) on delete cascade on update cascade;Query OK, 1 row affected (0.04 sec)Records: 1 Duplicates: 0 Warnings: 0再次试着把⼤哥删了:mysql> delete from dage where id=1;Query OK, 1 row affected (0.01 sec)mysql> select * from dage;Empty set (0.01 sec)mysql> select * from xiaodi;Empty set (0.00 sec)得,这回对应的⼩弟也没了,没办法,谁让你跟我on delete cascade了呢!例⼦说明的应该蛮清楚了吧,其他功能对应⼿册⾃⼰实践吧!:-)在知乎上看到关于设计数据库时是否使⽤外键的问题:外键是否采⽤看业务应⽤场景,以及开发成本的,⼤致列下什么时候适合,什么时候不适合使⽤:1. 互联⽹⾏业应⽤不推荐使⽤外键:⽤户量⼤,并发度⾼,为此数据库服务器很容易成为性能瓶颈,尤其受IO能⼒限制,且不能轻易地⽔平扩展;若是把数据⼀致性的控制放到事务中,也即让应⽤服务器承担此部分的压⼒,⽽引⽤服务器⼀般都是可以做到轻松地⽔平的伸缩;2.传统⾏业1>.软件应⽤的⼈数有限,换句话说是可控的;2>.数据库服务器的数据量也⼀般不会超⼤,且活跃数据有限;综合上述2句话描述,也即数据库服务器的性能不是问题,所以不⽤过多考虑性能的问题;另外,使⽤外键可以降低开发成本,借助数据库产品⾃⾝的触发器可以实现表与关联表之间的数据⼀致性和更新;最后⼀点,使⽤外键的⽅式,还可以做到开发⼈员和数据库设计⼈员的分⼯,可以为程序员承担更多的⼯作量;为何说外键有性能问题:1.数据库需要维护外键的内部管理;2.外键等于把数据的⼀致性事务实现,全部交给数据库服务器完成;3.有了外键,当做⼀些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,⽽不得不消耗资源;4.外键还会因为需要请求对其他表内部加锁⽽容易出现死锁情况;。
数据库设计中的主键和外键使用准则在数据库设计中,主键和外键是两个重要的概念。
它们用于建立数据表之间的关系,确保数据的完整性和一致性。
然而,在实际的设计过程中,很多人在使用主键和外键时存在一些困惑和误解。
本文将探讨主键和外键的使用准则,帮助读者更好地理解和应用它们。
1. 主键主键是用于唯一标识数据表中的每一行记录的字段或字段组合。
它具有以下几个特点:(1)主键的值在整个数据表中必须是唯一的,不能重复。
(2)主键的值不能为空,即不能为NULL。
(3)主键的值是不可变的,一旦确定就不能再修改。
在选择主键时,应注意以下几点:(1)选择唯一标识一行记录的字段或字段组合作为主键。
(2)尽量选择较短的字段作为主键,可以提高查询效率。
(3)避免选择经常变化的字段作为主键,这样可以减少更新操作的开销。
(4)考虑使用自增长字段作为主键,可以简化插入操作。
(5)不要使用业务相关的字段作为主键,以防止将来需求变化导致主键变化。
2. 外键外键用于建立不同数据表之间的关系,确保数据之间的一致性。
它具有以下几个特点:(1)外键是一个指向另一个数据表主键的字段。
(2)外键的值可以为NULL,表示该记录与其他记录没有关联。
(3)外键的值必须是在被关联表的主键值中存在的。
在使用外键时,应注意以下几点:(1)外键的命名应该具有描述性,清楚表示它与所关联表的关系。
(2)尽量限制外键字段的数据类型与长度与所关联表主键字段一致,以避免数据类型不匹配的错误。
(3)在创建外键时,应设定合适的级联操作,如级联更新或级联删除,以确保关联关系的完整性。
(4)外键的使用应尽量遵循数据库设计规范,避免滥用或误用。
3. 主键与外键的关系主键和外键是数据库设计中密不可分的概念。
它们之间的关系可以总结为以下几点:(1)主键可以作为外键的参照对象,即一个数据表的主键可以作为其他表的外键。
(2)外键必须引用主键,确保引用的数据是有效的。
(3)外键的引用关系可以建立多对一、一对一、多对多等多种关系。
关于数据库主键和外键一、什么是主键、外键关系型数据库中的一条记录中有若干个属性若其中某一个属性组(注意是组)能唯一标识一条记录该属性组就可以成为一个主键比如学生表(学号姓名性别班级) ,其中每个学生的学号是唯一的,学号就是一个主键,课程表(课程编号,课程名,学分) 。
其中课程编号是唯一的,课程编号就是一个主键。
成绩表(学号,课程号,成绩) 。
成绩表中单一一个属性无法唯一标识一条记录学号和课程号的组合才可以唯一标识一条记录所以学号和课程号的属性组是一个主键。
成绩表中的学号不是成绩表的主键但它和学生表中的学号相对应。
并且学生表中的学号是学生表的主键则称成绩表中的学号是学生表的外键。
同理成绩表中的课程号是课程表的外键定义主键和外键主要是为了维护关系数据库的完整性。
总结一下1.主键是能确定一条记录的唯一标识比如一条记录包括身份正号姓名年龄。
身份证号是唯一能确定你这个人的其他都可能有重复所以身份证号是主键。
2.外键用于与另一张表的关联。
是能确定另一张表记录的字段用于保持数据的一致性。
比如A表中的一个字段是B表的主键那他就可以是A表的外键。
二、主键、外键和索引的区别主键、外键和索引的区别?主键外键索引定义:唯一标识一条记录,不能有重复的,不允许为空表的外键是另一表的主键,外键可以有重复的,可以是空值该字段没有重复值,但可以有一个空值。
作用:用来保证数据完整性用来和其他表建立联系用的是提高查询排序的速度。
个数:主键只能有一个一个表可以有多个外键一个表可以有多个惟一索引。
聚集索引和非聚集索引的区别?聚集索引一定是唯一索引。
但唯一索引不一定是聚集索引。
聚集索引,在索引页里直接存放数据,而非聚集索引在索引页里存放的是索引,这些索引指向专门的数据页的数据。
三、数据库中主键和外键的设计原则主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。
主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。
必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。
主键和外键的区别
主键是本张表的主键,是唯一且非空的,而外键是另一张表中与这张表的某个字段的类型,字段名相同的字段,一般是用作关联两张或两张以上的数据表时用的。
以下面三张表为例:
有三张表,一张表是读者信息,有一个属性为readno,一张表是图书的信息,有一个属性是bookno,一张表是借阅关系,有两个属性分别以读者信息表中的readno,和图书信息表中的bookno为外键,我想问的是,在借阅关系表中插入数据时不是得自己写入readno和bookno吗,这样,设外键还有什么作用?
外键取值规则:空值或参照的主键值。
(1)插入非空值时,如果主键表中没有这个值,则不能插入。
(2)更新时,不能改为主键表中没有的值。
(3)删除主键表记录时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除。
(4)更新主键记录时,同样有级联更新和拒绝执行的选择。
简言之:
起约束作用,就是在借阅关系表中只能插入读者\图书信息表中存在的值
不然会出错.
作用在于如果你插入的readno或者bookno在两个表中没有,就会插不进去。