SQL中的主键和外键
数据库中的主键与外键介绍

2手动增长型字段既然自动增长型字段会带来如此的麻烦,我们不妨考虑使用手动增长型的字段,也就是说主键的值需要自己维护,通常情况下需要建立一张单独的表存储当前主键键值。还用上面的例子来说,这次我们新建一张表叫IntKey,包含两个字段,KeyName以及KeyValue。就像一个HashTable,给一个KeyName,就可以知道目前的KeyValue是什么,然后手工实现键值数据递增。在SQL
Server中可以编写这样一个存储过程,让取键值的过程自动进行。代码如下:
CREATE PROCEDURE[GetKey]
@KeyNamechar(10),
@KeyValue intOUTPUT AS UPDATE IntKey SET @KeyValue =KeyValue = KeyValue + 1
定义主键和外键主要是为了维护关系数据库的完整性,总结一下:
主键是能确定一条记录的唯一标识,比如,一条记录包括身份证号,姓名,年龄。身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。
外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。
COMB数据类型的基本设计思路是这样的:既然UniqueIdentifier数据因毫无规律可言造成索引效率低下,影响了系统的性能,那么我们能不能通过组合的方式,保留UniqueIdentifier的前10个字节,用后6个字节表示GUID生成的时间(DateTime),这样我们将时间信息与UniqueIdentifier组合起来,在保留UniqueIdentifier的唯一性的同时增加了有序性,以此来提高索引效率。也许有人会担心UniqueIdentifier减少到10字节会造成数据出现重复,其实不用担心,后6字节的时间精度可以达到1/300秒,两个COMB类型数据完全相同的可能性是在这1/300秒内生成的两个GUID前10个字节完全相同,这几乎是不可能的!在SQL
mysqlsqlprimarykey,key,index

mysqlsqlprimarykey,key,indexmysql 中的 sql 语句:[sql1]create table `t1`(name char(30) key,age int(4));其中的 key 表⽰ name 主键,相当于 name char(30) primary key;[sql2]create table `t2`(name char(30),age int(4),key(`name`));其中的 key 表⽰ name 为索引,相当于 index,此时的索引名默认的索引名,即(第⼀列名称或别的)⼀般有如下建⽴:[sql3] 还有⼀个是⽂的索引CREATE TABLE IF NOT EXISTS `terms` (`term_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(200) NOT NULL DEFAULT '',`slug` varchar(200) NOT NULL DEFAULT '',`term_group` bigint(10) NOT NULL DEFAULT '0', `datetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, // 2014-03-19 16:00:00 `date` date NOT NULL, // 2000-01-01 `time` time NOT NULL, // 00:01:01 `content` varchar(255) DEFAULT NULL,PRIMARY KEY (`term_id`), //主键索引UNIQUE KEY `slug` (`slug`), //唯⼀索引KEY `name` (`name`,`term_group`) //普通索引) ENGINE=MyISAM DEFAULT CHARSET=utf8;主键可以是多列组合,如多语⾔表,不能为空,可作外键,唯⼀索引列可为 NULL ,不能作外键,可建⽴多个唯⼀索引,默认时⽤主键是唯⼀索引。
SQL中的主键,候选键,外键,主码,外码

SQL中的主键,候选键,外键,主码,外码1、码=超键:能够唯⼀标识⼀条记录的属性或属性集。
标识性:⼀个数据表的所有记录都具有不同的超键⾮空性:不能为空有些时候也把码称作“键”2、候选键=候选码:能够唯⼀标识⼀条记录的最⼩属性集标识性:⼀个数据表的所有记录都具有不同的候选键最⼩性:任⼀候选键的任何真⼦集都不能唯⼀标识⼀个记录(⽐如在成绩表中(学号,课程号)是⼀个候选键,单独的学号,课程号都不能决定⼀条记录)⾮空性:不能为空候选键是没有多余属性的超键举例:学⽣ID是候选码,那么含有候选码的都是码。
少部分地⽅也有叫超级码的,但是见得不多3、主键=主码:某个能够唯⼀标识⼀条记录的最⼩属性集(是从候选码⾥⼈为挑选的⼀条)唯⼀性:⼀个数据表只能有⼀个主键标识性:⼀个数据表的所有记录都具有不同的主键取值⾮空性:不能为空⼈为的选取某个候选码为主码4、主属性包含在任⼀候选码中的属性称主属性。
简单来说,主属性是候选码所有属性的并集⾮主属性不包含在候选码中的属性称为⾮主属性。
⾮主属性是相对于主属性来定义的。
5、外键(foreign key):⼦数据表中出现的⽗数据表的主键,称为⼦数据表的外键。
6、全码:当所有的属性共同构成⼀个候选码时,这时该候选码为全码。
(教师,课程,学⽣)假如⼀个教师可以讲授多门课程,某门课程可以有多个教师讲授,学⽣可以听不同教师讲授的不同课程,那么,要区分关系中的每⼀个元组,这个关系模式R的候选码应为全部属性构成(教师、课程、学⽣),即主码。
7、代理键:当不适合⽤任何⼀个候选键作为主键时(如数据太长等),添加⼀个没有实际意义的键作为主键,这个键就是代理键。
(如常⽤的序号1、2、3)8、⾃然键:⾃然⽣活中唯⼀能够标识⼀条记录的键(如⾝份证)。
SQL中的主键和外键

一、什么是主键、外键:关系型数据库中地一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键比如学生表(学号,姓名,性别,班级)其中每个学生地学号是唯一地,学号就是一个主键课程表(课程编号,课程名,学分)其中课程编号是唯一地,课程编号就是一个主键成绩表(学号,课程号,成绩)成绩表中单一一个属性无法唯一标识一条记录,学号和课程号地组合才可以唯一标识一条记录,所以学号和课程号地属性组是一个主键成绩表中地学号不是成绩表地主键,但它和学生表中地学号相对应,并且学生表中地学号是学生表地主键,则称成绩表中地学号是学生表地外键同理成绩表中地课程号是课程表地外键定义主键和外键主要是为了维护关系数据库地完整性,总结一下:主键是能确定一条记录地唯一标识,比如,一条记录包括身份正号,姓名,年龄.身份证号是唯一能确定你这个人地,其他都可能有重复,所以,身份证号是主键.外键用于与另一张表地关联.是能确定另一张表记录地字段,用于保持数据地一致性.比如,表中地一个字段,是表地主键,那他就可以是表地外键.二、主键、外键和索引地区别收藏个人收集整理勿做商业用途主键、外键和索引地区别?聚集索引和非聚集索引地区别?聚集索引一定是唯一索引.但唯一索引不一定是聚集索引.聚集索引,在索引页里直接存放数据,而非聚集索引在索引页里存放地是索引,这些索引指向专门地数据页地数据.个人收集整理勿做商业用途三、数据库中主键和外键地设计原则主键和外键是把多个表组织为一个有效地关系数据库地粘合剂.主键和外键地设计对物理数据库地性能和可用性都有着决定性地影响.个人收集整理勿做商业用途必须将数据库模式从理论上地逻辑设计转换为实际地物理设计.而主键和外键地结构是这个设计过程地症结所在.一旦将所设计地数据库用于了生产环境,就很难对这些键进行修改,所以在开发阶段就设计好主键和外键就是非常必要和值得地.个人收集整理勿做商业用途主键:关系数据库依赖于主键它是数据库物理模式地基石.主键在物理层面上只有两个用途:. 惟一地标识一行.. 作为一个可以被外键有效引用地对象.基于以上这两个用途,下面给出了我在设计物理层面地主键时所遵循地一些原则:. 主键应当是对用户没有意义地.如果用户看到了一个表示多对多关系地连接表中地数据,并抱怨它没有什么用处,那就证明它地主键设计地很好.个人收集整理勿做商业用途. 主键应该是单列地,以便提高连接和筛选操作地效率.注:使用复合键地人通常有两个理由为自己开脱,而这两个理由都是错误地.其一是主键应当具有实际意义,然而,让主键具有意义只不过是给人为地破坏数据库提供了方便.其二是利用这种方法可以在描述多对多关系地连接表中使用两个外部键来作为主键,我也反对这种做法,理由是:复合主键常常导致不良地外键,即当连接表成为另一个从表地主表,而依据上面地第二种方法成为这个表主键地一部分,然,这个表又有可能再成为其它从表地主表,其主键又有可能成了其它从表主键地一部分,如此传递下去,越靠后地从表,其主键将会包含越多地列了.个人收集整理勿做商业用途. 永远也不要更新主键.实际上,因为主键除了惟一地标识一行之外,再没有其他地用途了,所以也就没有理由去对它更新.如果主键需要更新,则说明主键应对用户无意义地原则被违反了.个人收集整理勿做商业用途注:这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整理地数据并不适用.. 主键不应包含动态变化地数据,如时间戳、创建时间列、修改时间列等.. 主键应当有计算机自动生成.如果由人来对主键地创建进行干预,就会使它带有除了惟一标识一行以外地意义.一旦越过这个界限,就可能产生认为修改主键地动机,这样,这种系统用来链接记录行、管理记录行地关键手段就会落入不了解数据库设计地人地手中.个人收集整理勿做商业用途。
使用SQL语句修改表的主键和外键

使用sql语句修改表的主键和外键
主键约束:一定是非空的,唯一的,即一张表只能设计一个主键约束,但主键约束可以由多个字段构成,称之为联合主键或复合主键。
创建主键约束名称:
SQL> alter table 表名(最好在设置之前,表当中没有数据) add constraint pk_id primary key(id);
修改主键约束名称:
SQL> alter table表名
rename constraint pk_id to new_pk_id;
外键约束:主表当中字段必须是主表中的主键字段,主从表中相应的字段必须同一数据类型,从表中的外键字段的值必须来自主表相应字段,或NULL;
删除外键约束:
SQL> alter table 表名
disable constraint fk_typeid_alter;
修改表时添加外键约束:
SQL> alter table表名
add constraint fk_typeid_alter foreign key(typeid_new)references typeinfo 删除、添加后即将外键约束修改完成。
sql中主键写法

sql中主键写法在SQL(结构化查询语言)中,主键(Primary Key)是一个非常重要的概念,它用于唯一地标识数据库表中的每一行或记录。
主键不仅保证了数据的唯一性,还有助于数据库的高效查询和操作。
主键的定义与重要性主键是一个或多个字段的组合,其值在表中必须是唯一的,并且不能为null。
这意味着表中的每一行都必须有一个唯一的标识,这样我们才能准确地查询、更新或删除特定的记录。
主键的写法在创建表时,我们可以使用PRIMARY KEY关键字来定义主键。
下面是一个简单的例子,展示了如何在创建表时定义主键:在这个例子中,ID字段被定义为主键。
由于它被设置为NOT NULL,它还必须包含一个值。
此外,因为它是主键,所以它的值必须是唯一的。
复合主键除了单个字段作为主键外,我们还可以使用多个字段的组合作为主键,这被称为复合主键。
例如:在这个例子中,OrderID和CustomerID的组合被定义为主键。
这意味着每个订单都必须有一个唯一的OrderID,但对于同一个CustomerID,可以有多个不同的OrderID。
主键的好处1.唯一性:主键保证了表中每一行的唯一性,这有助于避免数据冗余和不一致性。
2.快速查询:数据库系统可以利用主键快速查找和检索数据。
3.数据完整性:主键约束确保了数据的完整性,防止了无效数据的插入。
4.外键关联:主键还可以用于建立表之间的关系,如外键约束,从而实现数据的关联和引用完整性。
总之,主键在SQL数据库设计中扮演着至关重要的角色。
正确地使用和管理主键,可以确保数据的准确性、完整性和高效性。
sql中,表级约束与列级约束的区别

sql中,表级约束与列级约束的区别在SQL Server中有5种约束:主键约束(primary key constraint)唯⼀性约束(unique constraint)检查约束(check constraint)缺省约束(default constraint)外部键约束(foreign key constraint)在SQL SERVER中,(1)对于基本表的约束分为列约束和表约束约束是限制⽤户输⼊到表中的数据的值的范围,⼀般分为列级约束与表级约束。
列级约束有六种:主键Primary key、外键foreign key 、唯⼀ unique、检查 checck 、默认default 、⾮空/空值 not null/ null表级约束有四种:主键、外键、唯⼀、检查列约束是对某⼀个特定列的约束,包含在列定义中,直接跟在该列的其他定义之后,⽤空格分隔,不必指定列名;表约束与列定义相互独⽴,不包括在列定义中,通常⽤于对多个列⼀起进⾏约束,与列定义⽤’,’分隔,定义表约束时必须指出要约束的那些列的名称。
完整性约束的基本语法格式为:[ CONSTRAINT <约束名> ] <约束类型>约束名:约束不指定名称时,系统会给定⼀个名称。
(2)列级约束与表级约束的区别如果完整性约束涉及到该表的多个属性列,必须定义在表级上,否则既可以定义在列级也可以定义在表级。
简⽽⾔之:列级约束:列级约束是⾏定义的⼀部分,只能应⽤于⼀列上。
表级约束:表级约束是独⽴于列的定义,可以应⽤在⼀个表中的多列上。
(3)列级约束与表级约束在SQL中的⽤法(即如何在SQL中定义约束)在创建表时定义约束:CREATE TABLE table_name({ -------列级约束定义|column_name AS computed_column_expression -------计算列定义| ------表级约束定义}[,….n])⼀个约束定义为列级约束还是表级约束根据实际需要和设计者思路确定。
SQL语句常用约束类型

SQL语句常⽤约束类型常⽤五类约束: not null:⾮空约束,指定某列不为空 unique:唯⼀约束,指定某列和⼏列组合的数据不能重复 primary key:主键约束,指定某列的数据不能重复、唯⼀ foreign key:外键,指定该列记录属于主表中的⼀条记录,参照另⼀条数据 check:检查,指定⼀个表达式,⽤于检验指定数据 注意: MySQL不⽀持check约束,但可以使⽤check约束,⽽没有任何效果;根据约束数据列限制,约束可分为: 单列约束:每个约束只约束⼀列 多列约束:每个约束约束多列数据1、not null ⾮空约束⽤于确保当前列的值不为空值,⾮空约束只能出现在表对象的列上。
*Null类型特征:所有的类型的值都可以是null,包括int、float等数据类型空字符串””是不等于null,0也不等于nullcreate table temp(id int not null,name varchar(255) not null default ‘abc’,sex char null)上⾯的table加上了⾮空约束,也可以⽤alter来修改或增加⾮空约束增加⾮空约束 alter table temp modify sex varchar(2) not null;取消⾮空约束 alter table temp modify sex varchar(2) null;取消⾮空约束,增加默认值 alter table temp modify sex varchar(2) default ‘abc’;2、unique 唯⼀约束是指定table的列或列组合不能重复,保证数据的唯⼀性。
虽然唯⼀约束不允许出现重复的值,但是可以为多个null,同⼀个表可以有多个唯⼀约束,多个列组合的约束。
在创建唯⼀约束的时候,如果不给唯⼀约束名称,就默认和列名相同。
MySQL会给唯⼀约束的列上默认创建⼀个唯⼀索引;create table temp (id int not null,name varchar(25),password varchar(16),constraint uk_name_pwd unique(name, password));unique(name, password)表⽰⽤户名和密码组合不能重复 添加唯⼀约束 alter table temp add unique(name, password); 修改唯⼀性约束 alter table temp modify name varchar(25) unique; 删除约束 alter table temp drop index name;3、primary key 主键约束相当于唯⼀约束+⾮空约束的组合,主键约束列不允许重复,也不允许出现空值;如果的多列组合的主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
主键与外键
一、什么是主键、外键:
关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键
比如
学生表(学号,姓名,性别,班级)
其中每个学生的学号是唯一的,学号就是一个主键
课程表(课程编号,课程名,学分)
其中课程编号是唯一的,课程编号就是一个主键
成绩表(学号,课程号,成绩)
成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以学号和课程号的属性组是一个主键
成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学生表的主键,则称成绩表中的学号是学生表的外键
同理成绩表中的课程号是课程表的外键
定义主键和外键主要是为了维护关系数据库的完整性,总结一下:
主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。
身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。
外键用于与另一张表的关联。
是能确定另一张表记录的字段,用于保持数据的一致性。
比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。
二、主键、外键和索引的区别收藏
聚集索引和非聚集索引的区别?
聚集索引一定是唯一索引。
但唯一索引不一定是聚集索引。
聚集索引,在索引页里直接存放数据,而非聚集索引在索引页里存放的是索引,这些索引指向专门的数据页的数据。
三、数据库中主键和外键的设计原则
主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。
主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。
必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。
而主键和外键的结构是这个设计过程的症结所在。
一旦将所设计的数据库用于了生产环境,就很难对这些键进行修改,所以在开发阶段就设计好主键和外键就是非常必要和值得的。
主键:
关系数据库依赖于主键---它是数据库物理模式的基石。
主键在物理层面上只有两个用途:
1. 惟一地标识一行。
2. 作为一个可以被外键有效引用的对象。
基于以上这两个用途,下面给出了我在设计物理层面的主键时所遵循的一些原则:
1. 主键应当是对用户没有意义的。
如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。
2. 主键应该是单列的,以便提高连接和筛选操作的效率。
注:使用复合键的人通常有两个理由为自己开脱,而这两个理由都是错误的。
其一是主键应当具有实际意义,然而,让主键具有意义只不过是给人为地破坏数据库提供了方便。
其二是利用这种方法可以在描述多对多关系的连接表中使用两个外部键来作为主键,我也反对这种做法,理由是:复合主键常常导致不良的外键,即当连接表成为另一个从表的主表,而依据上面的第二种方法成为这个表主键的一部分,然,这个表又有可能再成为其它从表的主表,其主键又有可能成了其它从表主键的一部分,如此传递下去,越靠后的从表,其主键将会包含越多的列了。
3. 永远也不要更新主键。
实际上,因为主键除了惟一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。
如果主键需要更新,则说明主键应对用户无意义的原则被违反了。
注:这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整理的数据并不适用。
4. 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。
5. 主键应当有计算机自动生成。
如果由人来对主键的创建进行干预,就会使它带有除了惟一标识一行以外的意义。
一旦越过这个界限,就可能产生认为修改主键的动机,这样,这种系统用来链接记录行、管理记录行的关键手段就会落入不了解数据库设计的人的手中。