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 主键约束相当于唯⼀约束+⾮空约束的组合,主键约束列不允许重复,也不允许出现空值;如果的多列组合的主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
SQL的主键和外键的作用
SQL的主键和外键的作用首先,主键是一列或一组列,其作用是唯一地标识一个表中的每一条记录。
它具有以下作用:1.数据唯一性约束:主键保证表中的每条记录具有唯一的标识,确保了数据的唯一性。
2.快速数据访问:通过主键,可以快速定位到表中的其中一条记录,提高数据的访问速度。
3.定义表之间的关系:在表之间建立关联时,主键作为外键的参照,起到了关联的作用。
4.提供索引:主键通常会自动创建一个索引,加快数据查找和排序。
主键有以下几种类型:1.单字段主键:一个表中只有一个字段作为主键。
2.复合主键:一个表中多个字段组合起来作为主键,确保组合字段的唯一性。
3.自增主键:主键的值会自动递增,常用于自动生成唯一标识符。
其次,外键是一个或多个表中的列,它建立了表之间的关联关系。
外键所在的表称为子表,参照外键的表称为父表。
1.建立表之间的关联:外键通过关联表之间的共同数据,建立了表与表之间的关联关系。
这种关联关系可以是一对一、一对多或多对多的关系。
2.数据完整性约束:外键保证在子表中如果存在外键,则在父表中必须存在相对应的值。
它确保了数据的完整性和一致性,防止出现孤立的记录。
3.级联更新与删除:在设定外键关联时,可以设置级联更新与删除。
当父表的记录被更新或删除时,所有相关的子表记录也会更新或删除,确保数据的一致性。
4.查询优化:外键可以用于连接两个或多个表,进行关联查询,提高查询效率。
需要注意的是,外键并不一定要与主键建立关联,它可以与任意唯一的键或索引字段建立关联。
此外,外键的使用还需要满足一些条件,如被关联的字段必须是一个已经定义了唯一性约束的字段。
在实际的数据库设计和应用中,主键和外键都被广泛地运用。
通过使用主键和外键,可以建立起复杂的数据模型,保证数据的完整性和一致性,并实现不同表之间的关联查询。
这在数据库管理和数据处理中起着至关重要的作用。
sql数据库表的关联关系
sql数据库表的关联关系
在SQL数据库中,表之间的关联关系指的是两个或多个表之
间的连接或关系。
这些关联关系可以通过主键和外键来实现。
1. 一对一关系(One-to-One Relationship):一个表的一条记
录与另一个表的一条记录相关联。
在一个表中的每个记录只能对应另一个表中的一条记录。
例如,一个用户可以有一个身份证号,而一个身份证号只能对应一个用户。
2. 一对多关系(One-to-Many Relationship):一个表的一条记
录与另一个表中多条记录相关联。
在一个表中的每个记录可以对应另一个表中的多个记录。
例如,一个部门可以有多个员工,但一个员工只能属于一个部门。
3. 多对多关系(Many-to-Many Relationship):一个表的多条
记录与另一个表的多条记录相关联。
在两个表之间的关联由第三个中间表来实现,该中间表存储了两个表之间的关联关系。
例如,一个学生可以选择多个课程,一个课程也可以被多个学生选择。
实现表之间的关联关系需要使用外键(Foreign Key)。
外键
是一个字段,它将一张表中的数据与另一张表中的数据关联起来。
外键字段通常是指向另一个表的主键字段。
通过外键,可以根据关联条件查询两个表之间的关联数据。
数据库关联关系在数据的查询、数据的一致性以及数据的完整
性上起着非常重要的作用。
在设计数据库结构的时候,需要考虑表之间的关联关系,以便能够进行有效的查询和操作数据。
SQL建立数据库主键外键
SQL建⽴数据库主键外键SET FOREIGN_KEY_CHECKS=0;#取消外键约束,Mysql中如果表和表之间建⽴的外键约束,则⽆法删除表及修改表结构。
DROP TABLE IF EXISTS `custinfo`;CREATE TABLE `custinfo` (`custID` varchar(19) NOT NULL COMMENT '客户号',`name` varchar(10) NOT NULL COMMENT '姓名',`sex` varchar(10) NOT NULL COMMENT '性别',`phone` varchar(20) NOT NULL COMMENT '⼿机号',`ID` varchar(19) DEFAULT NULL COMMENT '⾝份证号',`districtID` varchar(19) DEFAULT NULL COMMENT '区ID',`age` varchar(6) NOT NULL COMMENT '年龄',PRIMARY KEY (`custID`),KEY `FK_districtID_1` (`districtID`),CONSTRAINT `FK_districtID_1` FOREIGN KEY (`districtID`) REFERENCES `area_dim` (`districtID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='客户信息表';-- ------------------------------ Records of custinfo-- ----------------------------BEGIN;INSERT INTO `custinfo` VALUES ('1', '闫⼀⼀', '男', '136********', '567891321242345618', '10101', '18');INSERT INTO `custinfo` VALUES ('2', '朱三枪', '男', '136********', '567891984242345618', '20101', '28');INSERT INTO `custinfo` VALUES ('3', '姜为民', '男', '136********', '567891322489345618', '20101', '18');INSERT INTO `custinfo` VALUES ('4', '刘德华', '男', '136********', '567891989909345618', '30201', '28');INSERT INTO `custinfo` VALUES ('5', '张三三', '⼥', '136********', '567891322489349898', '30201', '18');INSERT INTO `custinfo` VALUES ('6', '刘思思', '男', '136********', '567891989909349007', '30201', '28');COMMIT;-- ------------------------------ Table structure for `cardinfo`-- ----------------------------DROP TABLE IF EXISTS `cardinfo`;CREATE TABLE `cardinfo` (`acct_no` varchar(19) NOT NULL COMMENT '账户',`balance` varchar(19) NOT NULL COMMENT '账号余额',`acct_status` varchar(19) NOT NULL COMMENT '账号状态',`openDate` varchar(19) NOT NULL COMMENT '开卡时间',`openmoney` varchar(19) NOT NULL COMMENT '开卡⾦额',`custID` varchar(19) NOT NULL COMMENT '客户号',`districtID` varchar(19) NOT NULL COMMENT '开户所在区ID',PRIMARY KEY (`acct_no`),KEY `FK_districtID` (`districtID`),KEY `FK_custID` (`custID`),CONSTRAINT `FK_districtID` FOREIGN KEY (`districtID`) REFERENCES `area_dim` (`districtID`),CONSTRAINT `FK_custID` FOREIGN KEY (`custID`) REFERENCES `custinfo` (`custID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='银⾏卡信息表';-- ------------------------------ Records of cardinfo-- ----------------------------BEGIN;INSERT INTO `cardinfo` VALUES ('1010357612121001', '888888', '1', '2019-07-19 08:49:37', '1.00', '1', '10101');INSERT INTO `cardinfo` VALUES ('1010357612121002', '888888', '1', '2019-07-18 08:49:37', '2.00', '2', '20101');INSERT INTO `cardinfo` VALUES ('1010357612121003', '888888', '0', '2019-07-19 08:49:37', '3.00', '3', '20101');INSERT INTO `cardinfo` VALUES ('1010357612121004', '888888', '1', '2019-07-19 08:49:37', '1.00', '1', '10101');INSERT INTO `cardinfo` VALUES ('1010357612121005', '888888', '1', '2019-07-18 08:49:37', '2.00', '2', '20101'); COMMIT;DROP TABLE IF EXISTS `area_dim`;CREATE TABLE `area_dim` (`districtID` varchar(19) NOT NULL COMMENT '区域ID',`area_name` varchar(19) NOT NULL COMMENT '区域名',`city_id` varchar(19) NOT NULL COMMENT '城市ID',`city_name` varchar(19) NOT NULL COMMENT '城市名',`province_id` varchar(19) DEFAULT NULL COMMENT '省ID',`province_name` varchar(19) DEFAULT NULL COMMENT '省名',PRIMARY KEY (`districtID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='区域码值表';-- ------------------------------ Records of area_dim-- ----------------------------BEGIN;INSERT INTO `area_dim` VALUES ('10101', '⼆七区', '101', '郑州市', '1', '河南省');INSERT INTO `area_dim` VALUES ('20101', '⾼新区', '201', '青岛市', '2', '⼭东省');INSERT INTO `area_dim` VALUES ('30201', '新区', '301', '⽯家庄市', '3', '河北省');COMMIT;SET FOREIGN_KEY_CHECKS = 1; #设置外检约束注:将同⼀个字段设置成2个表的外键时,2次的外键名应不同。
sqlite数据库外键详解
sqlite数据库外键详解Sqlite数据库外键是指在一个表中,通过引用另一个表中的列来约束数据完整性。
外键主要用于确保数据的参照完整性,防止数据在两个表之间的不一致。
Sqlite支持两种类型的外键约束:主键(PRIMARY KEY)和外键(FOREIGN KEY)。
以下是Sqlite数据库外键的详细解释:1. 主键(PRIMARY KEY):主键是表中唯一的一列或几列,用于唯一标识表中的每一行数据。
在一个表中,只能有一个主键。
主键列不能包含空值(NULL)。
创建主键的语法如下:```CREATE TABLE table_name (column1 data_type,column2 data_type,...,PRIMARY KEY (column1, column2, ...));```2. 外键(FOREIGN KEY):外键是表中的一列或几列,用于引用另一个表中的列。
外键约束规定,表中的数据在插入或更新时,必须满足参照关系。
外键可以包含空值(NULL),但引用的目标列不能包含空值。
创建外键的语法如下:```CREATE TABLE table_name (column1 data_type,column2 data_type,...,FOREIGN KEY (column1, column2, ...) REFERENCES another_table(column1, column2, ...));```其中,`another_table`是引用的目标表,`column1, column2, ...`表示目标表中的列。
3. 外键约束的作用:外键约束有助于维护数据的一致性和完整性。
当尝试插入或更新数据时,Sqlite会检查外键约束是否满足。
如果不满足,插入或更新操作将失败。
例如,有一个订单表(orders)和用户表(users),订单表中有用户ID(user_id)列,用户表中有主键ID(id)列。
SQL重要知识点梳理!
SQL重要知识点梳理!MySQL数据库-基础知识1.说说主键、外键、超键、候选键的差别并举例∙超键(super key):在关系中能唯一标识元组的属性集称为关系模式的超键。
∙候选键(candidate key):不含有多余属性的超键称为候选键。
也就是在候选键中,若再删除属性,就不是键了!∙主键(primary key):用户选作元组标识的一个候选键程序主键。
∙外键(foreign key):如果关系模式R中属性K是其它模式的主键,那么k在模式R 中称为外键。
举个例子,对于学生信息(学号身份证号性别年龄身高体重宿舍号)和宿舍信息(宿舍号楼号):∙超键:只要含有“学号”或者“身份证号”两个属性的集合就叫超键,例如R1(学号性别)、R2(身份证号身高)、R3(学号身份证号)等等都可以称为超键!∙候选键:不含有多余的属性的超键,比如(学号)、(身份证号)都是候选键,又比如R1中学号这一个属性就可以唯一标识元组了,而有没有性别这一属性对是否唯一标识元组没有任何的影响!∙主键:就是用户从很多候选键选出来的一个键就是主键,比如你要求学号是主键,那么身份证号就不可以是主键了!∙外键:宿舍号就是学生信息表的外键。
2.为什么一般用自增列作为主键?∙如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。
∙如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新记录都要被插到现有索引页的中间某个位置,此时MySQL不得不为了将新记录插到合适位置而移动数据,这增加了很多开销,同时会增加大量的碎片。
3.触发器的作用?∙安全性,可以基于数据库的值使用户具有操作数据库的某种权利。
∙审计,可以跟踪用户对数据库的操作。
∙实现复杂的非标准的数据库相关完整性规则,触发器可以对数据库中相关的表进行连环更新。
∙触发器能够拒绝或回退那些破坏相关完整性的变化,取消试图进行数据更新的事务。
sql语句约束条件
sql语句约束条件在 SQL 中,可以使用约束条件来定义对表中数据的限制规则。
常见的约束条件有以下几种:1. 主键约束(Primary Key Constraint):用于定义一个列或一组列作为表的主键,保证唯一性和非空性。
一个表只能有一个主键约束。
示例:CREATE TABLE students (id INT PRIMARY KEY, name VARCHAR(50), age INT);2. 外键约束(Foreign Key Constraint):用于定义表与表之间的关联关系,保证数据的完整性。
外部键约束要求一个表的列值必须在另一个表的主键列中存在。
示例:CREATE TABLE orders (order_id INT PRIMARY KEY, customer_id INT, FOREIGN KEY (customer_id) REFERENCES customers (customer_id));3. 唯一约束(Unique Constraint):用于保证指定列或一组列的值的唯一性,但可以允许空值。
示例:CREATE TABLE employees (employee_id INT, email VARCHAR(50) UNIQUE);4. 非空约束(Not Null Constraint):用于保证指定列不允许为空值。
示例:CREATE TABLE products (product_id INT,product_name VARCHAR(50) NOT NULL);5. 检查约束(Check Constraint):用于定义某列的取值范围或条件,使得插入或更新的数据必须符合指定的条件。
示例:CREATE TABLE customers (customer_id INT, age INT CHECK (age >= 18));这些约束条件可以在创建表时定义,也可以在已存在的表上进行修改。
主键和外键有什么区别?
主键和外键有什么区别?一、主键的定义及作用1. 主键是指在关系数据库表中,用来唯一标识一个记录的字段或字段组合。
- 主键可以是单个字段,也可以是多个字段的组合,其目的是为了确保表中每条记录都具有唯一性。
- 主键可以用来与其他表建立关联关系。
2. 主键具有以下作用:- 主键保证了表中每条记录的唯一性,避免了数据冗余和重复。
- 主键是用来在表之间建立关联关系的重要依据。
二、外键的定义及作用1. 外键是指关系数据库表中的一个字段,它与其他表的主键建立了关联关系。
- 外键字段的值指向其他表的主键值,用来确保数据的完整性和一致性。
- 外键可以用来建立表与表之间的关系,实现数据的连接查询。
2. 外键具有以下作用:- 外键保证了表与表之间的数据完整性和一致性,避免了数据的不一致和错误。
- 外键可以用来进行表之间的连接查询,方便了数据的获取和分析。
三、主键与外键的区别1. 唯一性:- 主键具有唯一性约束,确保了表中每条记录的唯一性。
- 外键是引用其他表的主键,用来建立关联关系,不要求唯一性。
2. 数据完整性:- 主键用来保证表中记录的完整性和一致性。
- 外键用来保证表与表之间的数据完整性和一致性。
3. 查询功能:- 主键可以用来作为查询的条件或连接表之间的关键字段。
- 外键可以用来进行表之间的连接查询,方便了数据的获取和分析。
4. 数据类型:- 主键可以是任意数据类型。
- 外键的数据类型必须与被引用表的主键数据类型一致。
总结:主键和外键在关系数据库中扮演着不同的角色。
主键是用来唯一标识一个记录的字段,保证了表中每条记录的唯一性;外键是与其他表的主键建立关联关系的字段,用来保证表与表之间数据的完整性和一致性。
主键和外键在数据查询和建立关联关系方面具有不同的功能,但都可以通过在数据库中进行定义和约束来确保数据的准确性和一致性。
查询主键的sql语句
查询主键的sql语句查询主键的SQL语句可以根据不同的数据库系统而有所不同。
以下是针对常见数据库系统的查询主键的SQL语句:1. 对于MySQL数据库,可以使用以下SQL语句查询主键:sql.SHOW KEYS FROM table_name WHERE Key_name = 'PRIMARY';其中,`table_name`是要查询的表的名称。
2. 对于Oracle数据库,可以使用以下SQL语句查询主键:sql.SELECT constraint_name, column_name.FROM user_cons_columns.WHERE table_name = 'YOUR_TABLE_NAME';其中,`YOUR_TABLE_NAME`是要查询的表的名称。
3. 对于SQL Server数据库,可以使用以下SQL语句查询主键:sql.SELECT COLUMN_NAME.FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE.WHERE OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + '.' + CONSTRAINT_NAME), 'IsPrimaryKey') = 1。
AND TABLE_NAME = 'YOUR_TABLE_NAME';其中,`YOUR_TABLE_NAME`是要查询的表的名称。
4. 对于PostgreSQL数据库,可以使用以下SQL语句查询主键:sql.SELECT pg_attribute.attname.FROM pg_index, pg_class, pg_attribute.WHERE pg_class.oid = 'YOUR_TABLE_NAME'::regclass. AND indrelid = pg_class.oid.AND pg_attribute.attrelid = pg_class.oid.AND pg_attribute.attnum = any(pg_index.indkey);其中,`YOUR_TABLE_NAME`是要查询的表的名称。
SQLServer多个主键与外键、复合主键与外键引用
SQLServer多个主键与外键、复合主键与外键引⽤⼀、SQL查表语句执⾏机制1、逻辑执⾏顺序:从上到下,先有后⾛2CREATE TABLE 学⽣表(学号 char(8) primary key,楼号 char(2) not null,foreign key(楼号) references 宿舍表(楼号),);CREATE TABLE 宿舍表(楼号 char(2) not null,primary key(楼号),);3、解决⽅法:调整建表顺序(先有主键,才可引⽤外键)CREATE TABLE 宿舍表(楼号 char(2) not null,primary key(楼号),);CREATE TABLE 学⽣表(学号 char(8) primary key,楼号 char(2) not null,foreign key(楼号) references 宿舍表(楼号),);⼆、1:1多个单⼀外键引⽤不同表单⼀主键(1)例题:Create table 图书表(书号 nchar(6) primary key,)Create table 书店表(书店编号 nchar(6) primary key,)Create table 图书销售表(书号 nchar(6) not null,书店编号 nchar(6) not null,销售⽇期 smalldatetime not null,primary key(书号,书店编号,销售⽇期),foreign key(书号) references 图书表(书号),foreign key(书店编号) references 书店表(书店编号))2三、n:m复合外键引⽤同⼀表复合主键1CREATE TABLE 宿舍表(楼号 char(2) not null,宿舍号 char(3) not null,primary key(楼号,宿舍号),);CREATE TABLE 学⽣表(学号 char(8) primary key,楼号 char(2) not null,宿舍号 char(3) not null,foreign key(楼号) references 宿舍表(楼号),foreign key(宿舍号) references 宿舍表(宿舍号),);(2)解决⽅法:同⼀表复合外键对应引⽤同⼀表复合主键CREATE TABLE 宿舍表(楼号 char(2) not null,宿舍号 char(3) not null,primary key(楼号,宿舍号),);CREATE TABLE 学⽣表(学号 char(8) primary key,楼号 char(2) not null,宿舍号 char(3) not null,foreign key(楼号,宿舍号) references 宿舍表(楼号,宿舍号),。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
主键与外键
一、什么是主键、外键:
关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键
比如
学生表(学号,姓名,性别,班级)
其中每个学生的学号是唯一的,学号就是一个主键
课程表(课程编号,课程名,学分)
其中课程编号是唯一的,课程编号就是一个主键
成绩表(学号,课程号,成绩)
成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以学号和课程号的属性组是一个主键
成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学生表的主键,则称成绩表中的学号是学生表的外键
同理成绩表中的课程号是课程表的外键
定义主键和外键主要是为了维护关系数据库的完整性,总结一下:
主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。
身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。
外键用于与另一张表的关联。
是能确定另一张表记录的字段,用于保持数据的一致性。
比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。
二、主键、外键和索引的区别收藏
聚集索引和非聚集索引的区别?
聚集索引一定是唯一索引。
但唯一索引不一定是聚集索引。
聚集索引,在索引页里直接存放数据,而非聚集索引在索引页里存放的是索引,这些索引指向专门的数据页的数据。
三、数据库中主键和外键的设计原则
主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。
主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。
必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。
而主键和外键的结构是这个设计过程的症结所在。
一旦将所设计的数据库用于了生产环境,就很难对这些键进行修改,所以在开发阶段就设计好主键和外键就是非常必要和值得的。
主键:
关系数据库依赖于主键---它是数据库物理模式的基石。
主键在物理层面上只有两个用途:
1. 惟一地标识一行。
2. 作为一个可以被外键有效引用的对象。
基于以上这两个用途,下面给出了我在设计物理层面的主键时所遵循的一些原则:
1. 主键应当是对用户没有意义的。
如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。
2. 主键应该是单列的,以便提高连接和筛选操作的效率。
注:使用复合键的人通常有两个理由为自己开脱,而这两个理由都是错误的。
其一是主键应当具有实际意义,然而,让主键具有意义只不过是给人为地破坏数据库提供了方便。
其二是利用这种方法可以在描述多对多关系的连接表中使用两个外部键来作为主键,我也反对这种做法,理由是:复合主键常常导致不良的外键,即当连接表成为另一个从表的主表,而依据上面的第二种方法成为这个表主键的一部分,然,这个表又有可能再成为其它从表的主表,其主键又有可能成了其它从表主键的一部分,如此传递下去,越靠后的从表,其主键将会包含越多的列了。
3. 永远也不要更新主键。
实际上,因为主键除了惟一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。
如果主键需要更新,则说明主键应对用户无意义的原则被违反了。
注:这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整理的数据并不适用。
4. 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。
5. 主键应当有计算机自动生成。
如果由人来对主键的创建进行干预,就会使它带有除了惟一标识一行以外的意义。
一旦越过这个界限,就可能产生认为修改主键的动机,这样,这种系统用来链接记录行、管理记录行的关键手段就会落入不了解数据库设计的人的手中。