zoukankan      html  css  js  c++  java
  • 数据库表外键设置

    http://blog.csdn.net/pplsunny/article/details/7747340

    我们在建立数据库的时候,需要为每张表指定一个主键,所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一标识某一行记录,所以可以确保执行数据更新、删除的时候不会出现张冠李戴的错误。当然,其它字段可以辅助我们在执行这些操作时消除共享冲突,不过就不在这里讨论了。主键除了上述作用外,常常与外键构成参照完整性约束,防止出现数据不一致。所以数据库在设计时,主键起到了很重要的作用。

    常见的数据库主键选取方式有:

    • 自动增长字段
    • 手动增长字段
    • UniqueIdentifier
    • “COMB(Combine)”类型

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

     

    详细例子:

         创建来年各个简单的表:Author表和Detail表

    Sql语句如下:

    create table Author
    (
    idint identity(1,1) primary key not null,
    namevarchar(50)
    )

    create table Detail
    (
    idint identity(1,1) primary key not null,
    author_id      int,

            detail            varchar(50)
    )

    --添加外键约束语法注释:alter table 表名 add constraint 约束名 foreign key (引用外键列名) references 外键表(外键列)

    可视化的操作方法:

      table->选中表->design->选中需要设置外键的字段->选择“关系”->选择"添加"->在表和列规范处选择右边省略号(见图一)->再选择相应关系(见图二)。

    如图:

    图一:

     


     

     

    图二:

     

     


     

    备注:

    1.。。外键和主键的字段的数据类型必须相同。

    2.。。在删除表的时候要先删除外键表才能删除主键表

    3.。。图二中主键表选择要设置外键字段参照的表(即主键表的一个主键是将要设计的外键),外键表就是要添加外键的表。

     

    下面提供一个网上搜集的综合实例.

    --创建数据库
    USE master
    GO
    IF EXISTS(SELECT * FROM sysdatabases WHERE NAME='study')
    DROP DATABASE study
    GO

    CREATE DATABASE study
    ON
    ( NAME = study_dat,
       FILENAME = 'c:/study/study_data.mdf',
       SIZE = 5MB,
       MAXSIZE = 25MB,
       FILEGROWTH = 5MB )
    LOG ON
    ( NAME = 'study_log',
       FILENAME = 'c:/study/study_log.ldf',
       SIZE = 5MB,
       MAXSIZE = 25MB,
       FILEGROWTH = 5MB )
    GO

    --打开库
    use study

    --创建表

    IF EXISTS(SELECT * FROM sysobjects WHERE NAME='Stu_PkFk_S')
    DROP TABLE Stu_PkFk_S
    GO
    create table Stu_PkFk_S
    (
    sno char(6),
    sname char(10),
    age int,
    sex char(2),
    constraint PK_S primary key (sno),   --主键
    constraint CK_age check(age>=0 and age<=150)  --约束
    )

    create table Stu_PkFk_C
    (
    cno char(8),
    cname char(16),
    credit int,
    constraint PK_C primary key (cno), --主键
    constraint CK_credit check (credit>=0)  --约束
    )

    create table Stu_PkFk_SC
    (
    sno char(6),
    cno char (8),
    constraint PK_SC primary key (sno,cno),
    constraint FK_s foreign key (sno) references Stu_PkFk_S(sno), --外键
    constraint FK_c foreign key (cno) references Stu_PkFk_C(cno)
    )

    --测试数据
    insert into Stu_PkFk_S values ('001','zhang',19,'男')

    insert into Stu_PkFk_S values('002','li',16,'女')

    insert into Stu_PkFk_C values('001','li',100)

    insert into Stu_PkFk_SC values('002','001')

    select * from Stu_PkFk_S
    select * from Stu_PkFk_C
    select * from Stu_PkFk_SC

    DELETE FROM Stu_PkFk_S
    DELETE FROM Stu_PkFk_SC

     
    --测试添加删除外键
    --添加外键约束语法注释:alter table 表名 add constraint 约束名 foreign key (引用外键列名) references 外键表(外键列)

    --删除外键
    alter table Stu_PkFk_Sc drop constraint  FK_s
    alter table Stu_PkFk_SC drop constraint  FK_c

    --添加外键
    alter table Stu_PkFk_Sc
            add constraint Fk_s
            foreign key (sno)
            references Stu_PkFk_S(sno)
    go

    alter table Stu_PkFk_SC
            add constraint Fk_c
            foreign key (cno)
            references Stu_PkFk_C(cno)
    go

     

    --测试添加删除主键

     --删除主键
    alter table Stu_PkFk_S drop constraint PK_S  
    go  

    --增加主键
    alter table Stu_PkFk_S add constraint  PK_S primary key (sno)  
    go

  • 相关阅读:
    HDU2059(龟兔赛跑)
    pat 1012 The Best Rank
    pat 1010 Radix
    pat 1007 Maximum Subsequence Sum
    pat 1005 Sign In and Sign Out
    pat 1005 Spell It Right
    pat 1004 Counting Leaves
    1003 Emergency
    第7章 输入/输出系统
    第六章 总线
  • 原文地址:https://www.cnblogs.com/shuiyun/p/2758432.html
Copyright © 2011-2022 走看看