zoukankan      html  css  js  c++  java
  • SQL的主键和外键的作用

    SQL的主键和外键约束

     

    转载自:http://www.cnblogs.com/ywb-lv/archive/2012/03/12/2391860.html感谢原文作者的总结

    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.name,systypes.name,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,

    sysobjects.name constraintName, sysobjects.xtype AS constraintType,

    syscolumns.name 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'

  • 相关阅读:
    vmware ubuntu 异常关机无法连接到网络
    Speed up GCC link
    常用的一些解压命令
    Log4j 漏洞复现
    Test Case Design method Boundary value analysis and Equivalence partitioning
    CCA (Citrix Certified Administrator) exam of “Implementing Citrix XenDesktop 4”
    What is Key Word driven Testing?
    SAP AGS面试小结
    腾讯2013终端实习生一面
    指针的引用
  • 原文地址:https://www.cnblogs.com/jiafuwei/p/4437496.html
Copyright © 2011-2022 走看看