SQL的主键和外键约束
- 格式:doc
- 大小:50.00 KB
- 文档页数:7
设置外键约束的基本语法
在关系型数据库管理系统(RDBMS)中,为了确保数据的完整性和一致性,可以设置外键约束(Foreign Key Constraint)。
外键约束定义了一个表中的列(称为外键),与另一表中的列(称为主键)之间的关系。
下面是设置外键约束的基本SQL语法:
ALTER TABLE 子表ADD CONSTRAINT 外键名称FOREIGN KEY (子表的外键列) REFERENCES 主表(主表的主键列);
具体说明如下:
•ALTER TABLE 子表:指定要添加外键约束的子表。
•ADD CONSTRAINT 外键名称:定义外键约束的名称,名称应该是唯一的,用于标识这个外键约束。
•FOREIGN KEY (子表的外键列):指定子表中的外键列,这是与主表中的主键列建立关系的列。
•REFERENCES 主表(主表的主键列):指定主表的名称和主键列,子表的外键将引用主表的主键。
下面是一个示例,演示如何使用SQL语句为两个表之间创建外键约束:
-- 创建主表CREATE TABLE 主表( 主键列INT PRIMARY KEY, -- 其他列); -- 创建子表,并添加外键约束CREATE TABLE 子表( 子表的外键列INT, -- 其他列CONSTRAINT fk_外键名称FOREIGN KEY (子表的外键列) REFERENCES 主表(主键列) );
在上面的示例中,我们首先创建了一个主表和一个子表,并在子表中
使用CONSTRAINT子句添加了一个外键约束,将子表的外键列与主表的主键列建立关系。
这样,如果试图在子表中插入一个不在主表中存在的值,将会触发外键约束错误。
这有助于确保数据的一致性和引用完整性。
SQL约束讲解编辑人:星辰·樱一.约束的类型SQL Server 系统提供了6种约束类型,即not null非空约束,primary key主键约束,Foreign key外键约束,unique唯一约束,check检查约束和default 默认约束。
约束与完整性之间的关系域完整性:default ,check。
实体完整性:primary key ,unique。
参照完整性:foreign key。
二.定义约束的方式定义约束可以使用create table语句或alter table语句完成。
前者表示创建表的同时定义约束,后者表示在已有表中定义约束。
定义约束时,即可以所约束放在一个列上,也可以约束放在多个列上。
前者称为列级约束,后者称为表级约束。
定义约束和修改约束时,要考虑以下几个因素:1.不必删除表,就可以直接创建、修改表和删除约束的定义。
2.应该在应用程序中增加错误检查机制,测试数据是否与约束相冲突。
3.当在表上增加约束时,SQL Server系统将检查表中的数据是否与约束冲突。
4.一般情况,约束的名称应该符合,约束类型简名_表名_列名_代号这样的形式。
1.主键约束主键约束用来强制数据的实体完整性,它是在表中定义一个主建来唯一标识表中的每行记录。
--T-SQL语句Create table 表名(列名数据类型constraint 主键约束名primary key [,···n] ---列级主键Constraint 主键约束名primary key (列名[,···n]) ---表级主键——alter table命令Alter table 表名Add constraint 列名primary key [clustered|nonclustered] {(列名[,···n])} ·clustered:表示在该列上建立聚集索引。
在SQL中,ALTER是用于修改数据库对象结构的命令。
它允许您添加、删除或修改表的列、约束、索引等。
下面是一些常用的ALTER 用法示例:1. 添加列:```sqlALTER TABLE table_nameADD column_name data_type;```2. 删除列:```sqlALTER TABLE table_nameDROP COLUMN column_name;```3. 修改列:```sqlALTER TABLE table_nameMODIFY COLUMN column_name new_data_type;```4. 添加主键约束:```sqlALTER TABLE table_nameADD CONSTRAINT constraint_name PRIMARY KEY (column_name);```5. 添加外键约束:```sqlALTER TABLE child_table_nameADD CONSTRAINT constraint_name FOREIGN KEY (child_column_name) REFERENCES parent_table_name (parent_column_name);```6. 删除约束:```sqlALTER TABLE table_nameDROP CONSTRAINT constraint_name;```7. 添加索引:```sqlALTER TABLE table_nameADD INDEX index_name (column_name);```8. 删除索引:```sqlALTER TABLE table_nameDROP INDEX index_name;```这些是ALTER命令的一些常见用法,您可以根据具体的需求和数据库系统的语法进行相应的调整。
请注意,使用ALTER命令时要小心,因为它可能会对数据库结构产生永久性的更改。
sql操作数据库(3)--外键约束、数据库表之间的关系、三⼤范式、多表查询、事务外键约束在新表中添加外键约束语法: constraint 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名)在已有表中添加外键约束:alter table 从表表名 add constraints 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名)删除外键语法: alter table 从表表名 drop foreign key 外键名称;级联操作:注意:在从表中,修改关联主表中不存在的数据,是不合法的在主表中,删除从表中已经存在的主表信息,是不合法的。
直接删除主表(从表中有记录数据关联) 会包删除失败。
概念:在修改或者删除主表的主键时,同时它会更新或者删除从表中的外键值,这种动作我们称之为级联操作。
语法:更新级联 on update cascade 级联更新只能是创建表的时候创建级联关系。
当更新主表中的主键,从表中的外键字段会同步更新。
删除级联 on delete cascade 级联删除当删除主表中的主键时,从表中的含有该字段的记录值会同步删除。
操作:-- 给从表student添加级联操作create table student(s_id int PRIMARY key ,s_name VARCHAR(10) not null,s_c_id int,-- constraint 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名)CONSTRAINT stu_cour_id FOREIGN key(s_c_id) REFERENCES course(c_id) -- 给s_c_id 添加外键约束ON UPDATE CASCADE ON DELETE CASCADE)insert into student VALUE(1,'⼩孙',1),(2,'⼩王',2),(3,'⼩刘',4);insert into student VALUE(4,'⼩司马',1),(5,'⼩赵',1),(6,'⼩钱',1);-- 查询学⽣表中的记录select * from student;-- 级联操作。
Oracle:SQL语句--对表的操作——添加主键约束–创建主外键(可以在创建表的同时添加主外键约束,也可以
–创建完成后再添加约束)
—–⽅法⼀:表创建的同时,添加主键约束
语法:
create table 表名
(
列名1 数据类型及长度 constraint 主键名称(⼀般主键名称为”PK_”开头) primary key,
列名2 数据类型及长度 not null,——-not null 约束该列不为空,不写表⽰可以为空
列名3 数据类型及长度
)tablespace 表空间名称;——-指定将该表放在某个表空间⾥,可以省略不指定
例:
create table T_DEPOSIT
(savingid VARCHAR2(20) constraint pk_savingid primary key,
savingname VARCHAR2(20) not null,
descrip VARCHAR2(50)
)tablespace ATM_tablespace;
————注意————-
CREATE TABLE T_cardInfo –银⾏卡信息表
(
cardID varchar2(19) primary key,
—— 如果此处这样定义主键,则主键名称系统⾃⼰定义设置
);
—–⽅法⼆:表创建后,添加主键约束
语法:
alter table 表名
add constraint 主键名称(⼀般主键名称为”PK_”开头) primary key(要设为主键的列名);
例:
alter table T_Grade
add constraint pk_gradeId primary key (gradeId);。
主键与外键一、什么是主键、外键:关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键比如学生表(学号,姓名,性别,班级)其中每个学生的学号是唯一的,学号就是一个主键课程表(课程编号,课程名,学分)其中课程编号是唯一的,课程编号就是一个主键成绩表(学号,课程号,成绩)成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以学号和课程号的属性组是一个主键成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学生表的主键,则称成绩表中的学号是学生表的外键同理成绩表中的课程号是课程表的外键定义主键和外键主要是为了维护关系数据库的完整性,总结一下:主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。
身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。
外键用于与另一张表的关联。
是能确定另一张表记录的字段,用于保持数据的一致性。
比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。
二、主键、外键和索引的区别收藏聚集索引和非聚集索引的区别?聚集索引一定是唯一索引。
但唯一索引不一定是聚集索引。
聚集索引,在索引页里直接存放数据,而非聚集索引在索引页里存放的是索引,这些索引指向专门的数据页的数据。
三、数据库中主键和外键的设计原则主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。
主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。
必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。
而主键和外键的结构是这个设计过程的症结所在。
一旦将所设计的数据库用于了生产环境,就很难对这些键进行修改,所以在开发阶段就设计好主键和外键就是非常必要和值得的。
主键:关系数据库依赖于主键---它是数据库物理模式的基石。
主键在物理层面上只有两个用途:1. 惟一地标识一行。
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语句常⽤约束类型常⽤五类约束: 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的主键和外键的作用首先,主键是一列或一组列,其作用是唯一地标识一个表中的每一条记录。
它具有以下作用:1.数据唯一性约束:主键保证表中的每条记录具有唯一的标识,确保了数据的唯一性。
2.快速数据访问:通过主键,可以快速定位到表中的其中一条记录,提高数据的访问速度。
3.定义表之间的关系:在表之间建立关联时,主键作为外键的参照,起到了关联的作用。
4.提供索引:主键通常会自动创建一个索引,加快数据查找和排序。
主键有以下几种类型:1.单字段主键:一个表中只有一个字段作为主键。
2.复合主键:一个表中多个字段组合起来作为主键,确保组合字段的唯一性。
3.自增主键:主键的值会自动递增,常用于自动生成唯一标识符。
其次,外键是一个或多个表中的列,它建立了表之间的关联关系。
外键所在的表称为子表,参照外键的表称为父表。
1.建立表之间的关联:外键通过关联表之间的共同数据,建立了表与表之间的关联关系。
这种关联关系可以是一对一、一对多或多对多的关系。
2.数据完整性约束:外键保证在子表中如果存在外键,则在父表中必须存在相对应的值。
它确保了数据的完整性和一致性,防止出现孤立的记录。
3.级联更新与删除:在设定外键关联时,可以设置级联更新与删除。
当父表的记录被更新或删除时,所有相关的子表记录也会更新或删除,确保数据的一致性。
4.查询优化:外键可以用于连接两个或多个表,进行关联查询,提高查询效率。
需要注意的是,外键并不一定要与主键建立关联,它可以与任意唯一的键或索引字段建立关联。
此外,外键的使用还需要满足一些条件,如被关联的字段必须是一个已经定义了唯一性约束的字段。
在实际的数据库设计和应用中,主键和外键都被广泛地运用。
通过使用主键和外键,可以建立起复杂的数据模型,保证数据的完整性和一致性,并实现不同表之间的关联查询。
这在数据库管理和数据处理中起着至关重要的作用。
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 ,,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,
constraintName, sysobjects.xtype AS constraintType, 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'。