mssql 创建主外键

  作者:会飞的

A. 使用 PRIMARY KEY 约束下例显示在示例数据库 pubs 的 jobs 表中,job_id 列中具有聚集索引的 PRIMARY KEY 约束的列定义;此例由系统提供约束名。job_id smallint PRIMARY KEY CLUSTERED下例显示如何为 PRIMARY KEY 约束提供名称。此约束用于 employee 表中的 emp_id 列。此列基于用户定义数据类型。emp_id empid CONSTRAINT PK_emp_id PRIM

A. 使用 PRIMARY KEY 约束


下例显示在示例数据库 pubs 的 jobs 表中,job_id 列中具有聚集索引的 PRIMARY KEY 约束的列定义;此例由系统提供约束名。


job_id   smallint

      PRIMARY KEY CLUSTERED

下例显示如何为 PRIMARY KEY 约束提供名称。此约束用于 employee 表中的 emp_id 列。此列基于用户定义数据类型。


emp_id   empid

      CONSTRAINT PK_emp_id PRIMARY KEY NONCLUSTERED

B. 使用 FOREIGN KEY 约束


FOREIGN KEY 约束用于引用其它表。FOREIGN KEY 可以是单列键或多列键。下例显示 employee 表上引用 jobs 表的单列 FOREIGN KEY 约束。对于单列 FOREIGN KEY 约束,只需要 REFERENCES 子句。


job_id   smallint      NOT NULL

      DEFAULT 1

      REFERENCES jobs(job_id)

也可以显式使用 FOREIGN KEY 子句并复述列特性。注意在这两个表中列名不必相同。


FOREIGN KEY (job_id) REFERENCES jobs(job_id)

多列键约束作为表约束创建。在 pubs 数据库中,sales 表包含多列 PRIMARY KEY。下例显示如何从其它表中引用此键(可选择显式约束名)。


CONSTRAINT FK_sales_backorder FOREIGN KEY (stor_id, ord_num, title_id)

   REFERENCES sales (stor_id, ord_num, title_id)

C. 使用 UNIQUE 约束


UNIQUE 约束用于强制非主键列的唯一性。PRIMARY KEY 约束列自动包含唯一性限制;但是,UNIQUE 约束允许存在空值。下例显示表 authors 中名为 pseudonym 的列。该列强制作者笔名必须唯一。


pseudonym varchar(30)   NULL

UNIQUE NONCLUSTERED

下例显示在 stor_id 实际上是 PRIMARY KEY 的 stores 表中,stor_name 列和 city 列上创建的 UNIQUE 约束;同一个城市中的商店不应同名。


CONSTRAINT U_store UNIQUE NONCLUSTERED (stor_name, city)

D. 使用 DEFAULT 定义


使用 INSERT 和 UPDATE 语句时,如果没有提供值,则默认值会提供值。在 pubs 数据库中,使用了许多 DEFAULT 定义以确保输入有效的数据或占位符。


在 jobs 表上,当没有显式输入实际的描述信息时,默认的字符串将提供描述信息(列 job_desc)。


DEFAULT 'New Position - title not formalized yet'

在 employee 表中,员工可以受雇于子公司或母公司。如果没有显式提供公司信息,则输入母公司(注意在表定义中可以嵌套注释,如下所示)。


DEFAULT ('9952')

/* By default the Parent Company Publisher is the company

to whom each employee reports. */

除了常量以外,DEFAULT 定义还可以包含函数。使用下例获取输入项的当前日期:


DEFAULT (getdate())

niladic 函数也可以提高数据的完整性。若要跟踪插入行的用户,请使用 niladic 函数 USER(niladic 函数不使用括号):


DEFAULT USER

E. 使用 CHECK 约束


下例显示对输入到 jobs 表中的 min_lvl 列和 max_lvl 列的值的限制。这两个约束都未命名:


CHECK (min_lvl >= 10)


CHECK (max_lvl <= 250)

下例显示对输入到 employee 表的 emp_id 列中的字符数据具有模式限制的命名约束。


CONSTRAINT CK_emp_id CHECK (emp_id LIKE 

   '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]' OR

   emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]')

下例指定 pub_id 必须在特定的列表中或遵循给定的模式。此约束用于 publishers 表中的 pub_id 列。


CHECK (pub_id IN ('1389', '0736', '0877', '1622', '1756')

   OR pub_id LIKE '99[0-9][0-9]')

F. 完整的表定义


下例显示 pubs 数据库中所创建的三个表(jobs、employee 和 publishers)的完整表定义,其中包含所有的约束定义。


/* ************************** jobs table ************************** */

CREATE TABLE jobs

(

   job_id  smallint

      IDENTITY(1,1)

      PRIMARY KEY CLUSTERED,

   job_desc        varchar(50)     NOT NULL

      DEFAULT 'New Position - title not formalized yet',

   min_lvl tinyint NOT NULL

      CHECK (min_lvl >= 10),

   max_lvl tinyint NOT NULL

      CHECK (max_lvl <= 250)

)


/* ************************* employee table ************************* */

CREATE TABLE employee 

(

   emp_id  empid

      CONSTRAINT PK_emp_id PRIMARY KEY NONCLUSTERED

      CONSTRAINT CK_emp_id CHECK (emp_id LIKE 

         '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]' or

         emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]'),

      /* Each employee ID consists of three characters that 

      represent the employee's initials, followed by a five 

      digit number ranging from 10000 through 99999 and then the 

      employee's gender (M or F). A (hyphen) - is acceptable 

      for the middle initial. */

   fname   varchar(20)     NOT NULL,

   minit   char(1) NULL,

   lname   varchar(30)     NOT NULL,

   job_id  smallint        NOT NULL

      DEFAULT 1

      /* Entry job_id for new hires. */

      REFERENCES jobs(job_id),

   job_lvl tinyint

      DEFAULT 10,

      /* Entry job_lvl for new hires. */

   pub_id  char(4) NOT NULL

      DEFAULT ('9952')

      REFERENCES publishers(pub_id),

      /* By default, the Parent Company Publisher is the company

      to whom each employee reports. */

   hire_date       datetime        NOT NULL

      DEFAULT (getdate())

      /* By default, the current system date is entered. */

)


/* ***************** publishers table ******************** */

CREATE TABLE publishers

(

   pub_id  char(4) NOT NULL 

         CONSTRAINT UPKCL_pubind PRIMARY KEY CLUSTERED

         CHECK (pub_id IN ('1389', '0736', '0877', '1622', '1756')

            OR pub_id LIKE '99[0-9][0-9]'),

   pub_name      varchar(40)     NULL,

   city         varchar(20)     NULL,

   state      char(2) NULL,

   country      varchar(30)     NULL

            DEFAULT('USA')

)

G. 在列中使用 uniqueidentifier 数据类型


下例创建含有 uniqueidentifier 列的表。该表使用 PRIMARY KEY 约束以确保用户不会在表中插入重复的值,并在 DEFAULT 约束中使用 NEWID() 函数为新行提供值。


CREATE TABLE Globally_Unique_Data

(guid uniqueidentifier 

   CONSTRAINT Guid_Default 

   DEFAULT NEWID(),

Employee_Name varchar(60),

CONSTRAINT Guid_PK PRIMARY KEY (Guid)

)

H. 对计算列使用表达式


下例显示如何使用表达式 ((low + high)/2) 计算 myavg 计算列。


CREATE TABLE mytable 

   (

    low int,

    high int,

    myavg AS (low + high)/2

   )

I. 对计算列使用 USER_NAME 函数


下例在 myuser_name 列中使用 USER_NAME 函数。


CREATE TABLE mylogintable

   ( 

    date_in datetime,

    user_id int,

    myuser_name AS USER_NAME()

   )

J. 使用 NOT FOR REPLICATION


下例显示如何在订阅了复制的表中使用 IDENTITY 属性。此表包含 CHECK 约束,以确保此系统生成的 SaleID 值不会增长到为复制发布服务器指派的范围内。


CREATE TABLE Sales

   (SaleID INT IDENTITY(100000,1) NOT FOR REPLICATION,

             CHECK NOT FOR REPLICATION (SaleID <= 199999),

    SalesRegion CHAR(2),

   CONSTRAINT ID_PK PRIMARY KEY (SaleID)

   )

实例:

create table A ( DJBH varchar(20) primary key ) go create table B ( IID int, DJBH varchar(20) FOREIGN KEY (DJBH) REFERENCES A(DJBH) ) 


有用  |  无用

猜你喜欢