文档库 最新最全的文档下载
当前位置:文档库 › SQL的主键和外键约束

SQL的主键和外键约束

SQL的主键和外键约束
SQL的主键和外键约束

SQL的主键和外键约束

SQL的主键和外键的作用:

外键取值规则:空值或参照的主键值。

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

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

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

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

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

关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键。

比如:

学生表(学号,姓名,性别,班级)

其中每个学生的学号是唯一的,学号就是一个主键;

课程表(课程编号,课程名,学分)

其中课程编号是唯一的,课程编号就是一个主键;

成绩表(学号,课程号,成绩)

成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以,学号和课程号的属性组是一个主键。

成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学生表的主键,则称成绩表中的学号是学生表的外键;同理,成绩表中的课程号是课程表的外键。

定义主键和外键主要是为了维护关系数据库的完整性,总结一下:

一、主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。

外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。比如,A 表中的一个字段,是B表的主键,那他就可以是A表的外键。

二、主键、外键和索引的区别

定义:

主键--唯一标识一条记录,不能有重复的,不允许为空

外键--表的外键是另一表的主键, 外键可以有重复的, 可以是空值

索引--该字段没有重复值,但可以有一个空值

作用:

主键--用来保证数据完整性

外键--用来和其他表建立联系用的

索引--是提高查询排序的速度

个数:

主键--主键只能有一个

外键--一个表可以有多个外键

索引--一个表可以有多个唯一索引

创建SQL的主键和外键约束的方法:

create table Student --建表格式:create table 自定义的表名

(--字段名一般为有一定意义的英文

StudentName nvarchar(15),-- 格式:字段名类型()括号里面的是允许输入的长度

StudentAge int,--int型的后面不需要接长度

StudentSex nvarchar(2)--最后一个字段后面不要逗号

)

--在创建表时就可以对字段加上约束:

create table Student

(

StudentNo int PRIMARY KEY IDENTITY(1,1),--加主键约束,还有标识列属性(两者构成实体完整性)

StudentName nvarchar(15)not null,--加非空约束,不加"not null" 默认为:可以为空

StudentSchool text(20)FOREIGN KEY REFERENCES SchoolTable(SchoolName), --加外键约束,格式:FOREIGN KEY REFERENCES 关联的表名(字段名)

StudentAge int DEFAULT((0)),--加默认值约束

StudentSex nvarchar(2)CHECK(StudentSex=N'男'or StudentSex=N'女')--加检查约束,格式:check (条件表达式)

)

--如果在表创建好了以后再加约束,则格式分别为:

-- 主键:

alter table表名

add constraint PK_字段名--"PK"为主键的缩写,字段名为要在其上创建主键的字段

名,'PK_字段名'就为约束名

primary key(字段名)--字段名同上

--唯一约束:

alter table表名

add constraint UQ_字段名

unique(字段名)

--外键约束:

alter table表名

add constraint FK_字段名--"FK"为外键的缩写

foreign key(字段名)references关联的表名(关联的字段名)--注意'关联的表名'和'关联的字段名'

alter table表A add constraint FK_B foreign key(ticket_no)references 表B(ticket_no)

alter table表A add constraint FK_C foreign key(person_no)references 表C(person_no)

alter table成绩表add constraint FK_StudentNo foreign key (StudentNo) references Student (StudentNo)

ON UPDATE CASCADE ON DELETE CASCADE

级联更新,级联删除,这样在删除主表Student时,成绩表中该学生的所有成绩都会删除。

--检查约束:

alter table表名

add constraint CK_字段名

check(条件表达式)--条件表达式中的条件用关系运算符连接

--默认值约束:

alter table表名

add constraint DF_字段名

default'默认值'for字段名--其中的'默认值'为你想要默认的值,注意'for'

--删除创建的约束:

alter table表名

drop constraint约束名--约束名为你前面创建的如:PK_字段这样的约束名

--注意:如果约束是在创建表的时候创建的,则不能用命令删除

--只能在'企业管理器'里面删除

-- 获取SqlServer中表结构

SELECT https://www.wendangku.net/doc/5012791973.html,,https://www.wendangku.net/doc/5012791973.html,,syscolumns.isnullable, syscolumns.length

FROM syscolumns,systypes

WHERE syscolumns.xusertype = systypes.xusertype

AND syscolumns.id =OBJECT_ID('Student')

-- 单独查询表递增字段

SELECT[name] FROM syscolumns WHERE

id =OBJECT_ID(N'Student')AND COLUMNPROPERTY(id,name,'IsIdentity')=1

-- 获取表主外键约束

EXEC sp_helpconstraint'StuResults'

-- 查询表主键外键信息

SELECT sysobjects.id objectId,OBJECT_NAME(sysobjects.parent_obj) tableName,

https://www.wendangku.net/doc/5012791973.html, constraintName, sysobjects.xtype AS constraintType, https://www.wendangku.net/doc/5012791973.html, AS columnName

FROM sysobjects INNER JOIN sysconstraints

ON sysobjects.xtype in('C','F','PK','UQ','D')

AND sysobjects.id = sysconstraints.constid

LEFT OUTER JOIN syscolumns ON sysconstraints.id = syscolumns.id WHERE OBJECT_NAME(sysobjects.parent_obj)='StuResults'

数据完整性约束-主键约束

数据完整性约束(一) —— SQL Server 2016数据库及应用

由于数据库中的数据是从外界输入的,然而数据的输入由于种种原因,会发生输入无效或错误信息,数据的完整性正是为了保证输入的数据符合规定而提出的。 数据完整性分为四类: 实体完整性、域完整性、参照完整性和用户自定义完整性。

1. 实体完整性: 实体完整性要求如果属性A是关系R的主属性,则属性A不能取空值。实体完整性用于保证关系数据库表中的每条记录都是唯一的,建立主键的目的就是为了实现实体完整性。 2. 域完整性: 用来保证数据的有效性,它可以限制录入的数据与数据类型是否一致,规定字段的默认值,设置字段是否可以为空,域完整性可以确保不会输入无效的数据。

3. 参照完整性:参照完整性是基于外键的,如果表中存在外键,则外键的值必须与主表中的某条记录的被参照列的值相同,参照完整性用于确保相关联表之间的数据保持一致。当添加、删除或修改数据表中记录时,可以借助于参照完整性来保证相关表之间数据的一致性。 ClassNo ClassName Specialty EnterYear Dno 0111801 网络3181 计算机网络技 术 2018 D01 0121901 软件3191 软件技术 2019 D01 主键 Class Sno Sname Sex Birth ClassNo s011180106 陈骏 男 2000/7/5 0111801 s012190118 陈天明 男 2000/7/18 0121901 主键 外键 Student

4. 用户自定义完整性: 用户自定义完整性约束就是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。 如何实现数据完整性,可以通过为表的字段设置约束来保证表中数据完整性。

数据库主键和外键的作用

数据库主键和外键的作用 首先介绍一下什么是主键、什么是外键。 1 什么是主键外键 学生表(学号,姓名,性别,班级) ? 学号是一个主键 课程表(课程号,课程名,学分) 课程号是一个主键 成绩表(学号,课程号,成绩) 学号和课程号的属性组构成一个主键 成绩表中的学号不是成绩表的主键,不过是学生表的主键,成绩表的外键,同理课程号也是成绩表的外键 定义:如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键 以一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表 2 外键的作用 外键用于保持数据一致性,完整性 主要目的是控制存储在外键表中的数据 3 主键的设计原则 1)主键应当是对用户没有意义的 2)主键应该是单列的,以提高连接和筛选操作的效率 复合键的使用通常出于两点考虑: a)主键应当具有意义-----这为认为的破坏数据库提供了方便 b)在描述多对多关系的连接表中可以使用两个外部键作为主键------该表可能成为其他从表的主表,并成为从表的主键的一部分,使得之后的从表包含更多的列 3)永远不要更新主键 4)主键不应该包含动态变化的数据(时间戳等) 5)主键应当由计算机自动生成 4 数据库主键选取策略 建立数据库的时候,需要为每张表指定一个主键(一个表只能有一个主键,但是可以有多个候选索引) 常见的主键选取方式有: 1)自动增长型字段 自动增长型主键会省略很多繁琐的工作,但在数据缓冲模式下,不能预先填写主键与外键的值 Order(OrderID,OrderDate)? //主键OrderID是自动增长型字段 OrderDetail(OrderID,LineNum,ProductID,Price)

数据库中主键与外键的理解

数据库中主键与外键的理解 在关系型数据库中,数据结构有逻辑结构和物理结构。物理结构指存储在物理介质上的数据文件的结构。逻辑结构即关系,也就是一张张的二维表。表中的一列即为一个字段(属性),代表的是实体的一个属性。表中的一行即为一条记录。如:学生表中(学号,姓名,年龄,性别),在该表中有4个字段,代表学生实体的4个属性。表中的一行数据(001,张三,男,20),即一条记录,表示的是张三这个学生的信息。 在表中,用来唯一标识一条记录的字段集,叫做主关键字或者主关键码,简称主键(主码),而主键包含的属性(字段)叫做主属性,其他的则为非主属性。 在这里说明一下,既然是“字段集”,那么主键就可能是一个字段或者多个字段。例如上面的学生表,用下划线表示的学号,就是能唯一标识一个学生的字段,学号字段就是该表的主键。由于学生的姓名重名是不可避免的,所以一般不用姓名来作为唯一标识一个学生的主键。再举个例子说明一下多个字段作为主键。例如学生选课表(学号,课程号,成绩),在学生选课表中,主关键字是(学号,课程号)。原因显而易见,一个学生可以选择多门课程,一个课程可以被多个学生选择。如果单单是用学号或者课程号,都不足以唯一标识一条记录。对于外键的理解,在这里我也举个例子。假设有两个表,学生表(学号,姓名,年龄,性别,专业编号),专业信息表(专业编号,专业名称,专业备注信息)。学生表中主键是学号,专业信息表中主键是专业编号。学生表中的非主属性专业编号恰好是专业信息表中的主键。我们就称这个专业编号是学生表的外键。像这样,一个表的非主属性是另一个表的主属性,该非主属性就是外键。 数据库的约束有三种,实体完整性约束、参照完整性约束和用户自定义约束。 1.实体完整性约束指的是主键不能为空,如果主键为空了还怎么唯一标识一条记录。

约束语法

SQL Server 2000支持下列五类约束:(1)DEFAULT约束(默认约束):当向数据库表中插入数据时,如果没有明确的提供输入值时,SQL S自动为该列输入指定值。(2)CHECK约束(检查约束):通过逻辑表达式判断限制插入到列中的值。(3)PRIMARY KEY约束(主键约束):不允许数据库表在指定列上具有相 同的值,且不允许有空值。(4)FOREIGN KEY约束(外键约束):定义数据库 表中指定列上插入或更新的数值必须在另一张被参照表中的特定列上存在。(5)UNIQUE约束(惟一约束):不允许数据库表在指定列上具有相同的值,但允许 有空值。约束也被分为列约束和表约束两类。列约束是指只对某一列起作用的约束。当一个约束中包含了数据库表中一个以上的列时,称为表约束。 24、约束的创建约束可以通过使用CREATE TABLE命令创建。具体语法如下: CREATE TABLE table_name (column_name data_type (NULL | NOT NULL)[[CONSTRAINT constraint_name]{PRIMARY KEY [CLUSTERED | NONCLUSTERED] | UNIQUE [CLUSTERED | NONCLUSTERED] | [FOREIGN KEY] REFERENCES ref_table [(ref_column)] | DEFAULT constant_expression | CHECK(logical_expression)}][,...]) 其中,各参数的意义 为: table_name:创建约束的表名称 column_name:创建约束的列的名 称 data_type:所在列的数据类型 constraint_name:新建约束的名称 [例题37] 在tsinghua数据库中创建一张用于教师信息管理的表teachers,表中包括的教师信息分别为:教师编号、教师姓名、性别、出身年月、所在系代号、职称、办公室电话号码、科研方向以及工作状态,在创建时定义有列约束和表约束。具体命令如下: use tsinghua CREATE TABLE tsinghua.dbo.teachers (TeacherID int NOT NULL, name nvarchar(5) NOT NULL, gender nchar(1) NULL, birthday datetime NULL, DeptCode tinyint NOT NULL, Title nvarchar(5) NULL, TelCode char(8) NOT NULL, aspect nvarchar(200) NULL, status nvarchar(5) NOT NULL CONSTRAINT DF_Status DEFAULT(' 在职'), CONSTRAINT PK_Teacher PRIMARY KEY CLUSTERED(TeacherID), CONSTRAINT FK_DeptCode FOREIGN KEY (DeptCode) REFERENCES dbo.departments(DeptCode), CONSTRAINT CK_TelCode CHECK(TelCode LIKE '627[0-9][0-9][0-9][0-9][0-9]'),) go 在这个例子中,用户可以看到我们使用的约束类型依次为非空约束、默认约束、主键约束、外键约束和检查约束。在结果显示窗口中可以看到错误提示: 服务器: 消息 1767,级别 16,状态 1,行 2 外键 'FK_DeptCode' 引用了无效的表 'dbo.departments'。服务器: 消息 1750,级别 16,状态 1,行 2 未能创建约束。请参阅前面的错误信息。 这是由于还没有在数据库tsinghua中创建外键约束FK_DeptCode所需表departments,用户可以通过下面指令先创建表departments: CREATE TABLE tsinghua.dbo.departments (DeptCode tinyint NOT NULL Primary Key, DeptName nchar(20) NOT NULL, TelCode char(8) NULL) go

经典SQL语句大全_主外键_约束

一、基础(建表、建约束、关系) 约束(Constraint)是Microsoft SQL Server 提供的自动保持数据库完整性的一种方法,定义了可输入表或表的单个列中的数据的限制条件(有关数据完整性的介绍请参见第9 章)。在SQL Server 中有5 种约束:主关键字约束(Primary Key Constraint)、外关键字约束(Foreign Key Constraint)、惟一性约束(Unique Constraint)、检查约束(Check Constraint)和缺省约束(Default Constraint)。 (最后几页介绍SQL基础约束) 1、说明:创建数据库 CREATE DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1. dat' --- 开始备份 BACKUP DATABASE pubs TO testBack 4、说明:创建新表 create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) --建表、建约束、关系 create table tableok ( col1 int, col2_notnull int not null, col3_default nchar(1) not null default('男'), --默认男 col4_default datetime not null default(getdate()), --默认得到系统时间 col5_check int not null check(col5_check>=18 and col5_check<= 55),--添加约束,数据值在18到55之间 col6_check nchar(9) not null check(col6_check like 'msd0902[0-9][^ 6-9]'), --添加约束,数据值前7位必须是‘msd0902’,倒数第两位可以是0-9中任意一个数字,最后一位不是6-9之间的数字。 cola_primary nchar(5) not null primary key, --建立主键 colb_unique int unique, --唯一约束 col7_Identity int not null identity(100,1), --自增长,从100开始,每列值增加1个

列级约束与表级约束

列级约束与表级约束 在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] )

语句注主键与外键的定义子句)(精)

一、建表(create table 语句。注:主键与外键的定义子句) create table student ( student_id char(6) not null primary key, student_name varchar(20) not null, class varchar(16) , sex tinyint , birthday datetime , credit tinyint , notes varchar(50) ) create table course ( course_id char(3) primary key, course_name varchar(16) , term tinyint , course_time tinyint , credit tinyint ) create table result ( student_id char(6) , course_id char(3) , grade tinyint , credit tinyint , constraint pk_result primary key (student_id,course_id), Constraint fk_result foreign key (course_id) references course (course_id) ) 二、修改表结构(alter table, drop table语句) 1.在表XS中增加1个新列——奖学金等级 ALTER TABLE XS ADD 奖学金等级tinyint NULL 2.在表XS中删除名为奖学金等级的列 ALTER TABLE XS DROP COLUMN 奖学金等级 3.修改表XS中已有列的属性 ALTER TABLE XS ALTER COLUMN 姓名char(10) 4.删除表XS DROP TABLE XS 三、修改表数据(insert,delete,update语句)

SQL的主键和外键的作用

SQL的主键和外键的作用: 外键取值规则:空值或参照的主键值。 (1)插入非空值时,如果主键表中没有这个值,则不能插入。 (2)更新时,不能改为主键表中没有的值。 (3)删除主键表记录时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除。 (4)更新主键记录时,同样有级联更新和拒绝执行的选择。 简而言之,SQL的主键和外键就是起约束作用。 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识 一条记录,该属性组就可以成为一个主键。 比如: 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,学号就是一个主键; 课程表(课程编号,课程名,学分) 其中课程编号是唯一的,课程编号就是一个主键; 成绩表(学号,课程号,成绩) 成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以,学号和课程号的属性组是一个主键。 成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学 生表的主键,则称成绩表中的学号是学生表的外键;同理,成绩表中的课程号是课程表的外键。 定义主键和外键主要是为了维护关系数据库的完整性,总结一下: 一、主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。身份证 号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。 外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。比如, A表中的一个字段,是B表的主键,那他就可以是A表的外键。 二、主键、外键和索引的区别 定义: 主键--唯一标识一条记录,不能有重复的,不允许为空 外键--表的外键是另一表的主键, 外键可以有重复的, 可以是空值 索引--该字段没有重复值,但可以有一个空值 作用:

主键、索引等的区别

键、索引、约束及其区别 今天下午刚好没事,把一些基础性的概念理顺一下,存档,省的麻烦,嘿嘿 一.索引 1.什么是索引? 索引是对数据库表中一列或多列的值进行排序的一种结构。 在关系型数据库中,索引是一种与表有关的数据库结构,是事实存在的。 它可以使对于表的select等等操作更加快速,相当于一本书的目录。 对于一张表,如果我们想要找到某一列符合特定值的记录,第一种方法是全表搜索,匹配,然后把所有符合的记录列出,但是这样做会消耗大量数 据库系统时间,并造成大量磁盘I/O操作;第二种就是在表中建立索引,然 后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相 当于页码)快速找到表中对应的记录。 索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。由此可 知,索引是要消耗数据库空间的。 并非所有的数据库都以相同的方式使用索引。作为通用规则,只有当经常查询索引列中的数据时,才需要在表上创建索引。索引占用磁盘空间,并 且降低添加、删除和更新行的速度。在多数情况下,索引用于数据检索的速 度优势大大超过它的不足之处。但是,如果应用程序非常频繁地更新数据或 磁盘空间有限,则可能需要限制索引的数量。 可以使用单列作为索引,也可以使用多列联合作为索引。 2.索引的优缺点 优点: (1)大大加快数据的检索速度; (2)创建唯一性索引,保证数据库表中每一行数据的唯一性; (3)加速表和表之间的连接; (4)在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排 序的时间。 缺点: (1)索引需要占物理空间。 (2)当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。 建立索引时的注意事项: (1)考虑已在表上创建的索引数量。最好避免在单个表上有很多索引 (2)检查已在表上创建的索引的定义。最好避免包含共享列的重叠索引 (3)检查某列中唯一数据值的数量,并将该数量与表中的行数进行比较。 比如如果有1000w记录,某字段为性别,只有男,女。也就是说一半 的记录都是重复的,这样就要考虑是否还有必要建立索引了。 3.一些索引类别 (1)普通索引 也即不加任何限制的索引。可通过以下语句理解。 create table zjj_temp_1 (id number(10),first_name char(10),last_name char(10),age number(3),val number(10,2));

数据库作业第三章

第三章关系数据库系统RDBS作业 一. 简答题 1.对于表中几个特殊的列,如主键、候选键和外键,分别用什么限制来保证它们的完整性?对 表中其它一般性的列,用什么限制来保证它们的完整性? 主键约束:主要是针对主键,以保证主键值的完整性。要求主键值必须满足值唯一、不能为空值。 唯一约束:主要是针对候选键,以保证主键值的完整性。要求候选键必须满足值唯一、可有一个且仅有一个空值。 外键约束:是维护表与表之间外键所对应属性(组)数据的一致性。主表到从表,表示主表中的主键值在修改和删除时,从表中与该主键值相同的外键值可级联(CASCADE)修改和删除,或改为空值(SET NULL)或默认值(SET DEFAULT),或禁止(NO ACTION)主表主键值的修改和删除;从表到主表,表示从表中的外键值在插入和修改时,其值应参照(REFERENCE)主表中的主键值。 对于其他一般性的列,还有检查约束和断言。 2.SQL SERVER中规则的目的? RULE主要是针对表中的某一列,指明该列的取值范围。 3.SQL SERVER中在定义某些限制时,分列级与表级,其分类的原则是什么? 列级检查约束针对表中一列,表级检查约束则针对同一表中多列。 4.外键限制定义的条件? 在含外键的表上定义; 定义外键限制的列必须是另一个表中的主键。 5.请说明在维护表间数据完整时外键限制与触发器的异同。 1.错误信息的管理上:约束与触发器在遇到问题时都可以返回给用户一定的错误信息。但是,触发器可以返回数据库管理员自定义的错误信息,而且还可以实现较为复杂的逻辑控制,而约束只能够通过标准化的系统错误信息来传递错误消息; 2.性能上的差异分析:从性能上来说,约束的执行性能都要高一点。虽然约束的执行性能比较高,但是其向用户提供的错误信息确实非常有限的。 3.管理维护的工作量:由于约束基本上都是数据库现成的解决方案。无论是索引约束还是外键约束,又或者是check约束。往往在数据库系统中已经有了现成的解决方案。数据库管理员通过直接引用这些解决方案即可以实现特定的功能,而不用再费力的编写触发器来实现。而触发器中系统没有现成的可以引用,而都需要数据库管理员通过实际清理来进行编写。 6.关系代数的基本操作符?笛卡尔乘积最大的作用是什么? 关系代数的基本操作符:SELECTION(选择)、PROJECTION(投影)、UNION(并或称联合)、INTERSECTION(交)、DIFFERENCE(差)、CROSS-PRODUCT(积)。 笛卡尔操作的最大作用是把任意两个不相关的表联接起来。 7.为什么说在实际查询中自然连接是用得比较多的? 自然连接可以从两个关系实例的笛卡尔乘积中选出同时满足一个或多个条件等式的行,每个条件等式中的列名相同。同时,在结果模式中重复的字段只有一个。 8.关系代数中对结果有重复元组时,如何处理? 对关系代数中对结果有重复元组时,将去掉重复元组。 9.连接的分类?

SQL Server外键设置笔记

SQL的主键和外键约束 SQL的主键和外键的作用: 外键取值规则:空值或参照的主键值。 (1)插入非空值时,如果主键表中没有这个值,则不能插入。 (2)更新时,不能改为主键表中没有的值。 (3)删除主键表记录时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除。 (4)更新主键记录时,同样有级联更新和拒绝执行的选择。 简而言之,SQL的主键和外键就是起约束作用。 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键。 比如: 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,学号就是一个主键; 课程表(课程编号,课程名,学分) 其中课程编号是唯一的,课程编号就是一个主键; 成绩表(学号,课程号,成绩) 成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以,学号和课程号的属性组是一个主键。 成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学生表的主键,则称成绩表中的学号是学生表的外键;同理,成绩表中的课程号是课程表的外键。 定义主键和外键主要是为了维护关系数据库的完整性,总结一下: 一、主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。 外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。 二、主键、外键和索引的区别 定义: 主键--唯一标识一条记录,不能有重复的,不允许为空 外键--表的外键是另一表的主键, 外键可以有重复的, 可以是空值 索引--该字段没有重复值,但可以有一个空值 作用: 主键--用来保证数据完整性 外键--用来和其他表建立联系用的 索引--是提高查询排序的速度 个数: 主键--主键只能有一个 外键--一个表可以有多个外键 索引--一个表可以有多个唯一索引 创建SQL的主键和外键约束的方法: create table Student --建表格式:create table 自定义的表名 ( --字段名一般为有一定意义的英文 StudentName nvarchar(15), -- 格式:字段名类型()括号里面的是允许输入的长度StudentAge int, --int型的后面不需要接长度

修改主键和外键

SQL中,一般要修改或者删除主键,只需要一个简单的命令即可:alter table 表名drop primary key. 下面我举例说明 先建一个表:table_project Create table table_project(‘id’ varchar(10),’name’ varchar(10),rmimary(‘name’)) Engine=myisam default charest=gb2312; 这时表已经建好,然后继续录入几个数据,等数据录入完成,此表格已经生成,如果这时你发现主键错了,想再改变主键就没那么简单了,因为你只是表格的结构错了,数据并没有错误,如果这时再删除表格重新建,无疑是在自寻苦恼。这时,其他只要两个命令就能完成。 1.先删除主键 Alter table table_project drop primary key 2.增加主键 Alter table table_project add primary key(id) 这就是如何不改变表内数据,修改主键的方法! 语法: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 */ 删除外键 语法: ALTER TABLE table-name DROP FOREIGN KEY key-id; 例: ALTER TABLE `tb_active` DROP FOREIGN KEY `FK_ID`

主键,外键等约束详解实例

1、--创建表 create table tb_Dept ( Deptid char(2)Primary key, DeptName char(16)Not Null ) 2、--外键约束 create table tb_Student ( Studid char(10)Primary key, Studname char(8)Not null, Deptid char(2)Not null, Constraint FK_DeptID Foreign Key(Deptid) References Tb_Dept(DeptID) ) 3、--外键约束简化形式,必须要求tb_Dept表中DeptID为主键,且数值类型相同create table Tb_Student ( StudId char(10)Primary key, StudName char(8)Not null, DeptID char(2)not null References Tb_Dept ) 4、--创建表,无主键 create table Tb_Class ( ClassID char(8)not null, ClassName varchar(30)not null, DeptId char(2)not null, ClassStuNumber int ) 5、--创建表,同时定义主键 create table Tb_Class ( classid char(8)not null, ClassName varchar(30)not null, DeptID char(2)not null, ClassStuNumber int constraint PK_ClassID Primary key (ClassID,ClassName) ) 6、--新增主键 Alter table Tb_class ADD Constraint PK_ClassID primary key(Classid) 7、--删除主键 Alter table tb_Class Delete Constraint PK_ClassID Primary key(ClassID) 8、--外键级联更新,删除,简化形式 Create table tb_student (

SQL中的主键和外键

主键与外键 一、什么是主键、外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,学号就是一个主键 课程表(课程编号,课程名,学分) 其中课程编号是唯一的,课程编号就是一个主键 成绩表(学号,课程号,成绩) 成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以学号和课程号的属性组是一个主键 成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学生表的主键,则称成绩表中的学号是学生表的外键 同理成绩表中的课程号是课程表的外键 定义主键和外键主要是为了维护关系数据库的完整性,总结一下: 主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。

外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。二、主键、外键和索引的区别收藏 聚集索引和非聚集索引的区别? 聚集索引一定是唯一索引。但唯一索引不一定是聚集索引。 聚集索引,在索引页里直接存放数据,而非聚集索引在索引页里存放的是索引,这些索引指向专门的数据页的数据。 三、数据库中主键和外键的设计原则 主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。 必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和外键的结构是这个设计过程的症结所在。一旦将所设计的数据库用于了生产环境,就很难对这些键进行修改,所以在开发阶段就设计好主键和外键就是非常必要和值得的。 主键: 关系数据库依赖于主键---它是数据库物理模式的基石。主键在物理层面上只有两个用途: 1. 惟一地标识一行。 2. 作为一个可以被外键有效引用的对象。 基于以上这两个用途,下面给出了我在设计物理层面的主键时所遵循的一些原则: 1. 主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。 2. 主键应该是单列的,以便提高连接和筛选操作的效率。

在sql server2008数据库中创建主外键

设置主、外键的方法 1、主键的设置 (1)设置gl22class表的主键 如图1所示。在gl22class表名上单击右键,选择设计命令,如A 处所示。打开右边的窗口,用鼠标单击要设置的关键字class_id的最左边箭头,如B处所示。最后单击主键,如C处所示。 A 图1 如果设置成功,如图2中A处所示。最后单击保存按钮。如B处所示。

图2 (2)设置gl22course 表的主键 和(1)设置class 表的主键的方法是一样的。Course 表的关键字是course_id 。最后单击保存按钮。 (3)设置gl22department 表的主键 和(1)设置class 表的主键的方法是一样的。department 表的关键字是dept_id 。最后单击保存按钮。 (4)设置gl22student 表的主键 和(1)设置class 表的主键的方法是一样的。student 表的关键字是student_id 。最后单击保存按钮。 (5)设置gl22grade 表的主键 和(1)设置class 表的主键的方法是一样的。grade 表的关键字是student_id 和course_id 。这两个属性要同时设置,设置方法是:按下shift 键,用鼠标单击A 处和B 处。同时选中后,单击C 处。最后 单

击保存按钮。 图3 2、外键的设置 (1)gl22class表和gl22department表设置外键 如图4所示。在gl22class表上单击右键选择设计命令。打开右边 A处所示。打开如图5所示的窗口。

图4 在图5中单击添加按钮,用鼠标单击表和列规范,出现A处的按钮,单击A处按钮,打开如图6所示的窗口。 图5

Oracle 主键约束

Oracle 主键约束 主键约束用于惟一地确定表中的每一行数据。在一个表中,最多只能有一个主键约束,主键约束即可以是一个列组成的,也可能是由两个或两个以上列组成的。对于表中的每一行数据,主键约束列都是不同的,主键约束同时也具有非空约束。 如果主键约束由一列组成时,该主键约束被称为行级约束。如果主键约束由两个或两个以列组成时,则该主键约束被称为表级约束。这两种不同类型的主键,在定义上有一点差异。 例如,在定义EMPLOYEES表时,为表定义了一个表级主键约束EMP_PK,该主键约束由EMPNO列组成: SQL> create table employees( 2 empno number(10), 3 ename varchar2(20) not null, 4 sex char(2), 5 salary number(8,2), 6 hiredate date default sysdate, 7 job varchar2(10), 8 email varchar2(50), 9 deptno number(3) not null, 10 constraint EMP_PK primary key (empno,ename)); 表已创建。 使用ALTER TABLE语句增加主键约束的部分语法形式如下: alter table table_name add constraint constraint_name primary key(column1[,column2]); 如果表上已经存在主键约束,那么当试图在该表上再增加一个主键约束时,系统就会生生一个错误信息。即使在不同的列上增加约束也是如此。例如,当在EMPLOYEES表的EMAIL列上再增加一个约束时,系统将产生“表中能具有一个主键”的错误消息。如下所示: SQL> alter table employees 2 add constraint emp_email_pk primary key (email); add constraint emp_email_pk primary key (email) * 第 2 行出现错误: ORA-02260: 表只能具有一个主键 与NOT NULL约束相同,当为表添加主键约束时,如果该表中已经存在数据,并且主键列具有相同的值或存在NULL值,则添加主键约束的操作将失败。 如果要为PRIMARY KEY约束指定名称,则必须使用CONSTRAINT关键字,如上面的示例所示。如果要使用系统自动为其分配的名称,则可以省略CONSTRAINT关键字。例如,下面的语句在创建EMPLOYEES表时在EMPNO列上定义了一个主键约束: create table employees( empno number(10) primary key, …

数据库主键外键设计原则 sky-v 博客园

数据库主键外键设计原则- sky-v - 博客园 主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。 必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和外键的结构是这个设计过程的症结所在。一旦将所设计的数据库用于了生产环境,就很难对这些键进行修改,所以在开发阶段就设计好主键和外键就是非常必要和值得的。 主键: 关系数据库依赖于主键---它是数据库物理模式的基石。主键在物理层面上只有两个用途: 1. 惟一地标识一行。 2. 作为一个可以被外键有效引用的对象。 基于以上这两个用途,下面给出了我在设计物理层面的主键时所遵循的一些原则: 1. 主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。 2. 主键应该是单列的,以便提高连接和筛选操作的效率。

注:使用复合键的人通常有两个理由为自己开脱, 而这两个理由都是错误的。其一是主键应当具有实际意义,然而,让主键具有意义只不过是给人为地破坏数据库提供了方便。其二是利用这种方法可以在描述多对多关系的连接表中使用两个外部键来作为主键,我也反对这种做法,理由是:复合主键常常导致不良的外键,即当连接表成为另一个从表的主表,而依据上面的第二种方法成为这个表主键的一部分,然,这个表又有可能再成为其它从表的主表,其主键又有可能成了其它从表主键的一部分,如此传递下去,越靠后的从表,其主键将会包含越多的列了。 3. 永远也不要更新主键。实际上,因为主键除了惟一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户无意义的原则被违反了。 注:这项原则对于那些经常需要在数据转换或多数 据库合并时进行数据整理的数据并不适用。 4. 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。 5. 主键应当有计算机自动生成。如果由人来对主键的创建进行干预,就会使它带有除了惟一标识一行以外的意义。一旦越过这个界限,就可能产生认为修改主键的动机,这样,这种系统用来链接记录行、管理记录行的关键手段就

数据库中的五种约束

数据库中的五种约束 数据库中的五种约束及其添加方法 五大约束 1.—-主键约束(Primay Key Coustraint)唯一性,非空性 2.—-唯一约束(Unique Counstraint)唯一性,可以空,但只能有一个 3.—-检查约束(Check Counstraint)对该列数据的范围、格式的限制(如:年龄、性别等) 4.—-默认约束(Default Counstraint)该数据的默认值 5.—-外键约束(Foreign Key Counstraint)需要建立两表间的关系并引用主表的列 五大约束的语法示例 1.—-添加主键约束(将stuNo作为主键) alter table stuInfo add constraint PK_stuNo primary key(stuNo) 2.—-添加唯一约束(身份证号唯一,因为每个人的都不一样) alter table stuInfo add constraint UQ_stuID unique(stuID) 3.—-添加默认约束(如果地址不填默认为“地址不详”) alter table stuInfo add constraint DF_stuAddress default(‘地址不详’)for stuAddress 4.—-添加检查约束(对年龄加以限定15-40岁之间) alter table stuInfo add constraint CK_stuAge check(stuAge between15and40) alter table stuInfo add constraint CK_stuSex check(stuSex=’男’or stuSex=’女′) 5.—-添加外键约束(主表stuInfo和从表stuMarks建立关系,关联字段stuNo) alter table stuInfo add constraint FK_stuNo foreign key(stuNo)references stuinfo(stuNo) 约束(Constraint)是Microsoft SQL Server提供的自动保持数据库完整性的一种方法,定义了可输入表或表的单个列中的数据的限制条件(有关数据完整性的介绍请参见第9章)。在SQL Server中有5种约束:主关键字约束(Primary Key Constraint)、外关键字约束(Foreign Key Constraint)、惟一性约束(Unique Constraint)、检查约束(Check Constraint)和缺省约束(Default Constraint)。 1主关键字约束 主关键字约束指定表的一列或几列的组合的值在表中具有惟一性,即能惟一地指定一行记录。每个表中只能有一列被指定为主关键字,且IMAGE和TEXT类型的列不能被指定为主关键字,也不允许指定主关键字列有NULL属性。

相关文档
相关文档 最新文档