Sql server中的主键与外键

来源:互联网 发布:subversion mac 编辑:程序博客网 时间:2024/05/22 05:12

        主键是用来强制一个字段或多个字段组合值的唯一性,且不允许该字段值为空值。在一个表中只能设置一个主键约束,但可以将包含多个字段的字段组合设置为主键。主键约束分为字段级约束和表级约束。字段级约束是为某一个字段设置约束。在设置字段级约束时,只需将创建主键约束的语句添加到该字段的定义子句后面。所谓表级约束是将将多个字段的字段组合设置为主键。

        一个表中有且只能有一个主键约束,它用来约束一个字段或多个字段组合的唯一值,并且不可为空。他与唯一性约束的区别在于一个表中可以有多个唯一性约束,并且其字段可以为空,唯一性约束的唯一性是指字段值的唯一此特性跟主键的作用一致。

        主键约束的对像是针对表内而外键约束定义了表与表之间的关系。当一个表中的一个列或多个列的组合和其它表中的主关键字定义相同时,就可以将这些列或列的组合定义为外关键字,并设定它是和哪个表中哪些列相关联。通常被设置了主键的表为父表,而设置外键的表为父表的从属表也称为子表。这样,当父表(在定义主关键字约束的表)中更新列值时,子表(其它表中有与父表相关联的外关键字约束的表)中的外关键字列也将被相应地做相同的更新。外关键字约束的作用还体现在,当子表插入数据时,如果父表表的列中没有与插入的外关键字列值相同的值时,系统会拒绝插入数据,即父表更新数据时子表也随之更新具有相同约束的相同的数据,而当子表更新与父表相关联的数据时如父表不存在所更新的数据则系统就会拒绝插入,体现父与子的一致性也体现了子从父的从属关系。

例:

       

/*建库,名为student_info使用student_info建student表,其中s_id为主键建test表,其中test_no为主键建marks表,其中marks表中的s_id和test_no为外建,分别映射student表中的s_id和test表中的test_no*/create database student_infouse student_infogocreate table student(s_id int identity(1,1) primary key,s_name varchar(20) not null,s_age int)gocreate table test(test_no int identity(1,1) primary key,test_name varchar(30),nax_marks int not null default(0),min_marks int not null default(0))gocreate table marks(s_id int not null,test_no int not null,marks int not null default(0),primary key(s_id,test_no),foreign key(s_id) references student(s_id) on update cascade  on delete cascade,foreign key(test_no) references test(test_no)on update cascade  on delete cascade)go

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


        总之主键与外键都是用来对数据进行约束的,主键确定值的唯一性为索引提供方便从而提高数据查询的速度,而外键是用来对表与表之间的数据进行约束,外键主要用于级联式更新数据、删除数据,从而达到保护数据库数据完整性的目的。使用外键之前必须先建立主键。
原创粉丝点击