主键,外键等约束详解实例
PowerDesigner为数据库物理模型字段添加主键、外键、非空、默认值、唯一等约束(持。。。

PowerDesigner为数据库物理模型字段添加主键、外键、⾮空、
默认值、唯⼀等约束(持。
⼀、为数据库字段添加主键、⾮空约束
主键约束和⾮空约束,在创建列字段的时候就可以⽅便的进⾏操作。
⼆、为数据库字段添加外键约束
外键⼀般是在创建好副表以后,进⾏关联。
双肩外键连接线,即可弹出外键约束的详细设置框。
三、为数据库字段添加默认值约束
双击表字段的列号,可以打开字段详情,对字段进⾏更详细的配置。
默认值,可以是输⼊的⼀个固定值。
也可以是系统的函数。
例如是system_user,或current_timestamp
有的时候需要为列字段添加多个枚举值约束。
例如性别的M:男,F:⼥,或者完成状态:Y,未完成状态:N等。
五、为数据库字段添加唯⼀性约束
有时候需要为列添加唯⼀性约束,也就是这⼀列只允许值出现⼀次。
例如登录⽤户名。
注意:如果要分别为⽤户名和昵称添加唯⼀约束,则需要添加两个Uq_key。
Uq_key1是对⽤户名的唯⼀性约束。
Uq_key2是为昵称的唯⼀性约束。
如果是在⼀个Uq_key中,同事勾选了⽤户名和昵称,则是对⽤户名和昵称的组合约束。
例如admin+nickname,和admin+nickname1,数据库就认为没有冲突,约束通过。
六、为数据库字段添加其他check约束。
1.最⼤值,最⼩值约束。
【数据库】主键,外键,主表,从表,关联表,父表,子表

【数据库】主键,外键,主表,从表,关联表,⽗表,⼦表⼀、前⾔在设计中,hibernate,iBatis等ORM框架的使⽤中经常听说主键,外键,主表,从表,关联表,⽗表,⼦表之类的术语,弄懂它们之前的区别与联系对于和ORM框架的学习使⽤是⾮常有必要的。
⼆、概述下⾯从数据库设计⾓度,ORM框架使⽤(以Hibernate为例),PowerDesigner软件以及实际业务⾓度进⾏⼀下介绍。
(1) 数据库⾓度⽽⾔主键:⼀般情况下,满⾜第⼀范式的表都有⼀个主键Primary key,⽤于唯⼀标⽰数据库中的⼀个字段。
外键:外键是相对于数据库设计中的参考完整性⽽⾔,它与主键之间是彼此依赖的关系。
假设现在有两个表,产品分类表ProductCategory(主键CategoryId)和产品信息表Product(主键ProductId),每类产品都属于⼀个分类。
那么如果产品信息表肯定需要参考产品分类表进⾏定义。
因为如果没有产品分类表,⼜何谈产品分类呢。
所以产品信息表Product需要引⽤ProductCategory中的主键CategoryId 进⾏产品分类定义,Product表中引⽤CategoryId的字段就是外键。
在概念模型(Concept Model)中,从产品分类⾓度看,产品分类和产品之间就是⼀对多的关系,⼀个分类下可以有多个产品。
从产品⾓度看,产品和产品分类之间是多对⼀的关系,多种产品属于⼀个分类。
主表:在数据库中建⽴的表格即Table,其中存在主键(primary key)⽤于与其它表相关联,并且作为在主表中的唯⼀性标识。
(摘⾃百度百科)从表:以主表的主键(primary key)值为外键 (Foreign Key)的表,可以通过外键与主表进⾏关联查询。
从表与主表通过外键进⾏关联查询。
(摘⾃百度百科)关联表:两个数据库及其(数据)表之间的数据的相互依赖和影响关系。
⽐如现有某学校三个数据表:学⽣(学号,姓名),课程(课程名,课程编号),选课(学号,课程号,成绩)。
表的5种约束

表的5种约束表共有五种约束,它们是主键、⾮空、惟⼀、检查和外键。
1.主键(PRIMARY KEY)主键是表的主要完整性约束条件,主键惟⼀地标识表的每⼀⾏。
⼀般情况下表都要定义主键,⽽且⼀个表只能定义⼀个主键。
主键可以包含表的⼀列或多列,如果包含表的多列,则需要在表级定义。
主键包含了主键每⼀列的⾮空约束和主键所有列的惟⼀约束。
主键⼀旦成功定义,系统将⾃动⽣成⼀个B*树惟⼀索引,⽤于快速访问主键列。
⽐如图书表中⽤“图书编号”列作主键,“图书编号”可以惟⼀地标识图书表的每⼀⾏。
主键约束的语法如下:[CONSTRANT 约束名] PRIMARY KEY --列级[CONSTRANT 约束名] PRIMARY KEY(列名1,列名2,...) --表级2.⾮空(NOT NULL)⾮空约束指定某列不能为空,它只能在列级定义。
在默认情况下,Oracle允许列的内容为空值。
⽐如“图书名称”列要求必须填写,可以为该列设置⾮空约束条件。
⾮空约束语法如下:[CONSTRANT 约束名] NOT NULL --列级3.惟⼀(UNIQUE)惟⼀约束条件要求表的⼀列或多列的组合内容必须惟⼀,即不相重,可以在列级或表级定义。
但如果惟⼀约束包含表的多列,则必须在表级定义。
⽐如出版社表的“联系电话”不应该重复,可以为其定义惟⼀约束。
惟⼀约束的语法如下:[CONSTRANT 约束名] UNIQUE --列级[CONSTRANT 约束名] UNIQUE(列名1,列名2,...) --表级4.检查(CHECK)检查约束条件是⽤来定义表的⼀列或多列的⼀个约束条件,使表的每⼀列的内容必须满⾜该条件(列的内容为空除外)。
在CHECK条件中,可以调⽤SYSDATE、USER等系统函数。
⼀个列上可以定义多个CHECK约束条件,⼀个CHECK约束可以包含⼀列或多列。
如果CHECK约束包含表的多列,则必须在表级定义。
⽐如图书表的“单价”的值必须⼤于零,就可以设置成CHECK约束条件。
外键约束(20171015)

外键约束先要理清几个概念:1)候选键(Candidate Key):关系中的一个属性组,其值能唯一标识一个元组,若从该属性组中去掉任何一个属性,它就不具有这一性质了,这样的属性组称作候选键(候选码)。
2)主键(Primary Key):当有多个候选键时,可以选定一个作为主键,选定的候选键称为主键(主码)。
主键唯一标识表中的每行记录。
主键约束有如下特点:每个表中只能有一个主键,主键可以是一列,也可以是多列的组合;主键值必须唯一并且不能为空,对于多列组合的主键,某列值可以重复,但列的组合值必须唯一。
3)外键(Foreign Key):关系R中的一个属性组,它不是R的候选键,但它与另一个关系S 的候选键相对应,则称这个属性组为R的外键(外码)。
关系R称为参照关系(参照表、从表),关系S称为被参照关系(被参照表、主表)。
外键是指一个表(从表)中的一列或列组合,它虽不是该表的主键,但却是另一个表(主表)的主键。
通过外键约束可以为相关联的两个表建立联系,实现数据的引用完整性,维护两表之间数据的一致性关系。
特殊情况下,参照关系和被参照关系可以是同一个关系。
即,特殊情况下,从表和主表可以是同一个表。
参照[引用]关系(Referencing Relation)、子表、从表、外键表、参照[引用]表,这些作为同一术语的同义词使用。
被参照[被引用]关系(Referenced Relation)、父表、主表、主键表、被参照[被引用]表、查找表,这些作为同一术语的同义词使用。
请注意,在英语国家讲数据库的英语文献中,relation有时指“表”,有时指两表之间的联系(relationship)。
指两表之间的relationship时也常用link[链接]。
relationship和relation通常都翻译为关系,但在数据库中两者含义不同。
relationship [关系;联系;关联],在数据库中指不同表之间的数据彼此联系的方法。
mysql数据库外键、主键详解

mysql数据库外键、主键详解⼀、什么是主键、外键:关系型数据库中的⼀条记录中有若⼲个属性,若其中某⼀个属性组(注意是组)能唯⼀标识⼀条记录,该属性组就可以成为⼀个主键⽐如学⽣表(学号,姓名,性别,班级)其中每个学⽣的学号是唯⼀的,学号就是⼀个主键课程表(课程编号,课程名,学分)其中课程编号是唯⼀的,课程编号就是⼀个主键成绩表(学号,课程号,成绩)成绩表中单⼀⼀个属性⽆法唯⼀标识⼀条记录,学号和课程号的组合才可以唯⼀标识⼀条记录,所以学号和课程号的属性组是⼀个主键成绩表中的学号不是成绩表的主键,但它和学⽣表中的学号相对应,并且学⽣表中的学号是学⽣表的主键,则称成绩表中的学号是学⽣表的外键同理成绩表中的课程号是课程表的外键定义主键和外键主要是为了维护关系数据库的完整性,总结⼀下:1.主键是能确定⼀条记录的唯⼀标识,⽐如,⼀条记录包括⾝份正号,姓名,年龄。
⾝份证号是唯⼀能确定你这个⼈的,其他都可能有重复,所以,⾝份证号是主键。
2.外键⽤于与另⼀张表的关联。
是能确定另⼀张表记录的字段,⽤于保持数据的⼀致性。
⽐如,A表中的⼀个字段,是B表的主键,那他就可以是A表的外键。
⼆、主键、外键和索引的区别sql语句会⾃动判定查询字段有⽆索引,继⽽使⽤索引去检索主键、外键和索引的区别?主键外键索引定义:唯⼀标识⼀条记录,不能有重复的,不允许为空表的外键是另⼀表的主键, 外键可以有重复的, 可以是空值该字段没有重复值,但可以有⼀个空值作⽤:⽤来保证数据完整性⽤来和其他表建⽴联系⽤的是提⾼查询排序的速度个数:主键只能有⼀个⼀个表可以有多个外键⼀个表可以有多个惟⼀索引聚集索引和⾮聚集索引的区别?聚集索引⼀定是唯⼀索引。
但唯⼀索引不⼀定是聚集索引。
聚集索引,在索引页⾥直接存放数据,⽽⾮聚集索引在索引页⾥存放的是索引,这些索引指向专门的数据页的数据。
三、数据库中主键和外键的设计原则主键和外键是把多个表组织为⼀个有效的关系数据库的粘合剂。
数据库约束条件

数据库约束条件
数据库约束条件是在关系型数据库中用来保证数据完整性和一致性的规则,用来限制对数据进行修改或者插入的操作。
这些约束条件可以应用在单个表或跨多个表之间。
以下是常见的几种数据库约束条件:
1. 主键约束:主键是用来唯一标识一张表中的每一行数据的列或者一组列。
主键列的值不能重复,必须唯一。
主键约束可以确保表中每一行数据都有一个唯一标识。
2. 外键约束:外键是一个表中的列,它与另一个表中的列相关联。
外键约束可以确保数据的一致性,它要求外键值必须要在另一个表中存在。
3. 唯一约束:唯一约束要求某一列或几列的值必须唯一,但是允许NULL值。
唯一约束可以确保表中某个列的值都是唯一的。
4. 非空约束:非空约束规定某一列不允许为空值。
非空约束可以确保表中某一列不会出现空值。
5. 检查约束:检查约束可以确保列中的数据仅限于特定的值或范围内。
可以通
过使用函数、表达式或逻辑语句来定义检查约束。
通过应用这些约束条件,可以确保数据库中的数据完整性和一致性,避免数据被误操作、损坏或者删除。
同时,这些约束条件也可以提高数据库的性能和可靠性,使得数据库更加稳定和可靠。
外键约束句

外键约束句1. 外键约束啊,就像是守护数据关系的小卫士呢。
比如说,在一个学校的数据库里,学生表和班级表有关系,学生表中的班级编号这个外键,就保证了每个学生都能对应到正确的班级,不会出现一个学生被分到不存在的班级这种混乱情况。
哼,要是没有外键约束,那数据的世界可就乱套喽,就像一群没了领头羊的小羊,到处乱跑。
2. 外键约束,那可是数据库里的大功臣呀。
想象一下,你开了一家连锁超市,有商品表和仓库表。
商品表中的仓库编号外键,就像是一条无形的链子,把商品稳稳地拴在对应的仓库上。
不然的话,商品都不知道自己该待在哪座仓库,这可怎么行呢?这就好比客人去超市找东西,却发现东西到处乱放,那得多糟心啊。
3. 外键约束可不是个简单的玩意儿,它像一个严厉的监工。
拿电商平台举例吧,订单表和用户表之间有联系,订单表中的用户ID外键,时刻监督着订单必须与存在的用户相关联。
要是没有这个约束,就像火车脱了轨,订单可能会关联到一个不存在的用户,那这生意还怎么做呀?哎呀,简直不敢想。
4. 外键约束,就如同在数据海洋里的灯塔。
就说图书馆管理系统吧,图书表和借阅者表相关联,借阅者表中的借阅者ID外键在图书借阅记录里起着关键作用。
它保证每本被借出去的书都能对应到一个真实的借阅者,就像灯塔指引船只一样准确。
要是没有它,图书就像没了方向的船只,不知道被谁借走了,这图书馆还不乱糟糟的?5. 外键约束是数据世界的规矩制定者呢。
例如在一家公司的人事管理数据库里,员工表和部门表是有关联的,员工表中的部门编号外键确保每个员工都隶属于正确的部门。
要是没有这个约束,员工就像散兵游勇,到处乱入部门,那公司的管理还能有序进行吗?这就好比一个乐队没有指挥,各自乱弹乱奏。
6. 外键约束哟,是数据库关系的安全带。
比如说在一个旅游预订系统里,行程表和游客表有联系,行程表中的游客ID外键就像是安全带一样紧紧地系着行程和游客。
如果没有这个外键约束,行程可能会分配给不存在的游客,这就像飞机没有安全带,在飞行过程中随时可能出乱子,多危险呀。
mysql 外键(foreign key)的详解和实例

mysql 外键(foreign key)的详解和实例在MySQL中,外键(foreign key)是用来实现表与表之间关联的一种机制。
外键约束能够保证数据在被插入和更新时的完整性和一致性,大大提高了数据的稳定性和可靠性。
外键的作用是在一个表中创建一个或多个字段,该字段引用另一个表中的主键字段。
可以将外键视为数据表之间的桥梁,将多个表连接在一起,从而形成一个大的逻辑数据模型。
下面是一个关于外键的实例:假设我们有两个数据表:学生表(student)和班级表(class),每个学生都属于一个班级。
学生表中的数据记录包含学生的名字、ID 和班级ID,班级表中的数据记录包括班级的名字和ID。
我们想要实现一个关系:每个学生都有一个班级,且该班级必须在班级表中存在。
为了实现这个关系,需要在学生表中创建一个外键字段,引用班级表中的主键字段。
首先需要在班级表中创建一个主键,例如class_id。
然后,将该主键字段作为外键引用到学生表中,例如student_class_id。
下面是创建班级表的SQL语句:CREATE TABLE class (class_id INT PRIMARY KEY,class_name VARCHAR(50) NOT NULL);然后,创建学生表的SQL语句如下:CREATE TABLE student (student_id INT PRIMARY KEY,student_name VARCHAR(50) NOT NULL,student_class_id INT,FOREIGN KEY (student_class_id) REFERENCES class(class_id) );在上述SQL语句中,创建了一个 student_class_id 字段,并创建了一个外键约束,引用了 class 表中的 class_id 主键。
这保证了每个学生所属的班级必须在班级表中存在。
总的来说,外键使得数据表之间的联系更加紧密,减少了数据不一致的情况。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 intconstraint PK_ClassID Primary key(ClassID,ClassName))6、--新增主键Alter table Tb_classADDConstraint PK_ClassID primary key(Classid)7、--删除主键Alter table tb_ClassDeleteConstraint PK_ClassID Primary key(ClassID)8、--外键级联更新,删除,简化形式Create table tb_student(studID char(10)Primary key,StudName char(10)not null,DeptID char(2)not null References tb_DeptOn Update cascadeon delete cascade)9、--外键级联更新,删除,标准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)on update Cascadeon delete cascade)10、--创建无外键的表create table tb_student(studId char(10)Primary key,StudName char(8)not null,DeptID char(2)not Null)11、--给相应的列(DeptID)添加外键约束Alter table tb_StudentADDConstraint FK_DeptID Foreign key(DeptID) References tb_Dept(DeptID)12、--删除外键约束Alter table tb_StudentDropConstraint fk_DeptID13、--创建表是创建Unique约束Create table tb_Student(studId char(10)Primary key,Studname char(8)not null Unique nonclustered, DeptID char(2)not null references Tb_Dept)create table tb_student(studID char(10)Primary key,Studname char(8)not null,deptid char(2)not null references tb_dept,constraint Uk_Stuname Unique(Stuname))14、--创建表结束后,添加、删除Unique约束--添加Unique约束alter table tb_StudentADDConstraint Uk_Depname Unique(Deptname)15、--删除unique约束Alter table tb_studentDropConstraint uk_Depname16、--创建默认值约束Create table tb_student(stuId char(10)Primary key,stuName char(8)not null,DeptID char(2)Not null references tb_Dept,sex char(2)not null default'M',Birthday smalldatetime not null default getdate())17、--添加默认值约束alter table tb_studentADDconstraint DEF_sex default'M'for sex18、--删除默认值约束alter table tb_studentDropConstraint DEF_Sex19、--创建表时,创建check约束create table tb_student(StudId char(10)Primary key,Studname char(8)not null,DeptId char(2)not null references tb_Dept,sex char(2)not null default'M'check(sex in('M','F')),zipcode char(6)not null check(Zipcode like'[0-9][0-9][0-9][0-9][0-9][0-9]'),constraint ck_StudID Check(StudId like'S[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'))20、--check约束的其他例子check(coursescore >= 0 and coursescore <= 100)check(empld like'[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]' or empld like'[A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]')check(telno in('86022679','86022235','86022879','86022886','86028225') or telno like'860221[0-9][0-9]')check(salary between 3000 and 10000)check(is_manager = 1 and sex ='F')check(case when is_manager<> 1 and sex ='F')Then 1Else 0 End= 021、--添加check约束alter table tb_student with nocheckADDConstraint ck_Sex check(sex in('M','F'))22、--删除check约束alter table tb_studentDropconstraint ck_sex--数据完整性总结1、--Primary key 约束--非聚集索引不超过个,聚集索引最多个--primary key未指定索引,索引类型与Unique相同--Primary key的所有列必须非空not null2、--Unique约束--默认使用nonclustered--每个Unique都生成一个索引,非聚集索引不超过,聚集索引最多个3、--Foreign key--Foreign key列输入非空值,该值必须在被引用列中存在--Foreign key约束仅能引用同一服务器的数据库表,跨数据库的引用必须通过触发器实现--列级的Foreign key约束的references子句只能列出一个引用列,且数据类型必须相同--表级Foreign key约束的references子句引用列的数目必须与约束列的列数相同,没个列的数据类型必须相同--类型为timestamp的列是外键、被引用键的部分,不能指定cascade、set Null、set default --临时表不强制Foreign key约束--Foreign key只能引用所引用的表的Primary key或unique 约束中的列,或引用的表上的Unique Index中的列4、--Default定义--每列只能有一个Default定义--Default定义可以包含常量值,函数,或Null--不能对类型为timestamp的列,或自增长型的列,创建Default定义5、--Check约束--列级Check约束只能引用被约束的列,表级Check约束只能引用同一表中的列--不能在text、ntext、或image列上定义check约束6、--其他约束相关信息--为约束创建的索引不能用Drop Index删除,必须用Alter table删除约束--如果某个表有约束以及触发器,则将在触发器执行前先检查约束条件--若要获得关于表及其列的报表,请使用sp_help或sp_helpconstraint表名--若要获得与表相关的视图和存储过程的报表,请使用sp_depends--若列为计算列,是否为空由系统确定。
使用带AllowsNull属性的ColumnProperty函数--索引--索引:包含键(表或视图中的一个或多个列所生成),以及指针(映射到数据的存储位置的指针)-- 索引是一个单独的,物理的数据库结构,依赖表而建,提供编排表中数据的内部方法-- 一个表的存储由两部分组成:存储数据的页面,存储索引的页面-- 建立索引,提高查询速度,但是过多索引,会占据过多的磁盘空间-- 创建索引的列:常用,外键或主键,值唯一Create Index lx_Stuname On tb_Student(StuName)go--聚集索引与数据存储均为物理顺序,查找效率很高,因此每个表只能有一个聚集索引--主键的索引默认为聚集索引Create Nonclustered index lx_StuName_Sex On tb_Student(StuName,Sex) go--非聚集索引,由指针(指向表中数据)与一个索引值(一般为键)构成。