Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SAP Sybase SQL Anywhere 16.0 (中文) » SQL Anywhere 服务器 - SQL 用法 » 表、视图和索引 » 外键

 

创建外键 (SQL)

可以在 Interactive SQL 中使用 CREATE TABLE 和 ALTER TABLE 语句来创建和变更外键。这些语句可以设置多个表属性,其中包括列约束和检查。

前提条件

创建外键所需的特权取决于表所有权,具体如下所述:

  • 您同时拥有被引用(主键)表和引用(外键)表   不需要任何特权。

  • 您拥有引用表,但不拥有被引用表   必须对表具有 REFERENCES 特权,或者具有 CREATE ANY INDEX 或 CREATE ANY OBJECT 系统特权之一。

  • 您拥有被引用表,但不拥有引用表  

    • 必须具有 ALTER ANY OBJECT 或 ALTER ANY TABLE 系统特权之一。
    • 或者,必须对表具有 ALTER 特权,并且具有 COMMENT ANY OBJECT、CREATE ANY OBJECT 或 CREATE ANY TABLE 系统特权之一。
    • 还必须对该表具有 SELECT 特权,或者具有 SELECT ANY TABLE 系统特权。

  • 被引用表和引用表均不由您所有  

    • 必须对表具有 REFERENCES 特权,或者具有 CREATE ANY INDEX 或 CREATE ANY OBJECT 系统特权之一。
    • 必须具有 ALTER ANY OBJECT 或 ALTER ANY TABLE 系统特权之一。
    • 或者,必须对表具有 ALTER 特权,并且具有 COMMENT ANY OBJECT、CREATE ANY OBJECT 或 CREATE ANY TABLE 系统特权之一。
    • 还必须对该表具有 SELECT 特权,或者具有 SELECT ANY TABLE 系统特权。

必须对该表具有 SELECT 特权,或者具有 SELECT ANY TABLE 系统特权。

您还必须是表的所有者,或者具有以下其中一种特权:

  • 表的 ALTER 特权,以及 COMMENT ANY OBJECT、CREATE ANY OBJECT 或 CREATE ANY TABLE 系统特权之一
  • ALTER ANY TABLE 系统特权
  • ALTER ANY OBJECT 系统特权

上下文和注释

创建外表时,您不必创建外键,因为系统会自动创建外键。

 任务
  1. 连接到数据库。

  2. 执行类似以下内容的 ALTER TABLE 语句:

    ALTER TABLE table-name ADD FOREIGN KEY foreign-key-name 
    ( column-name ASC ) REFERENCES table-name ( column-name )

结果

已将表定义更新为包括外键定义。

在下例中,将创建一个名为 Skills 的表,其中列出可能有的技能,然后创建一个与 Skills 表具有外键关系且名为 EmployeeSkills 的表。请注意,EmployeeSkills.SkillID 与 Skills 表的主键列 (Id) 存在外键关系。



CREATE TABLE Skills (
   Id INTEGER PRIMARY KEY,
   SkillName CHAR(40),
   Description CHAR(100) 
);
CREATE TABLE EmployeeSkills (
   EmployeeID INTEGER NOT NULL,
   SkillID INTEGER NOT NULL,
   SkillLevel INTEGER NOT NULL,
   PRIMARY KEY( EmployeeID ),
   FOREIGN KEY (SkillID) REFERENCES Skills ( Id )
);

您也可以在创建完表后使用 ALTER TABLE 语句将外键添加到该表。在下例中,将创建与上例中类似的表,唯一不同之处是在创建表后再添加外键。



CREATE TABLE Skills2 (
   ID INTEGER PRIMARY KEY,
   SkillName CHAR(40),
   Description CHAR(100) 
);
CREATE TABLE EmployeeSkills2 (
   EmployeeID INTEGER NOT NULL,
   SkillID INTEGER NOT NULL,
   SkillLevel INTEGER NOT NULL,
   PRIMARY KEY( EmployeeID ),
);
ALTER TABLE EmployeeSkills2
   ADD FOREIGN KEY SkillFK ( SkillID )
   REFERENCES Skills2 ( ID );

可以在创建外键时指定外键的属性。例如,以下语句将创建与示例 2 中相同的外键,但它将外键定义为 NOT NULL,同时定义更新或删除数据时的限制。

ALTER TABLE Skills2
ADD NOT NULL FOREIGN KEY SkillFK ( SkillID )
REFERENCES Skills2 ( ID )
ON UPDATE RESTRICT
ON DELETE RESTRICT;

外键列名和主键列名将根据在两个列表中的位置进行一对一式的配对。如果在定义外键时未指定主表列名,则使用主键列。例如,假设按如下方式创建两个表:

CREATE TABLE Table1( a INT, b INT, c INT, PRIMARY KEY ( a, b ) );
CREATE TABLE Table2( x INT, y INT, z INT, PRIMARY KEY ( x, y ) );

然后,按如下方式创建外键 fk1,明确指定如何对两个表之间的列进行配对:

ALTER TABLE Table2 ADD FOREIGN KEY fk1( x,y ) REFERENCES Table1( a, b );

使用下面的语句创建第二个外键 fk2,仅指定外表列。数据库服务器会自动将这两个列与主表主键中的前两列配对。

ALTER TABLE Table2 ADD FOREIGN KEY fk2( x, y ) REFERENCES Table1;

使用下面的语句创建外键,不指定主表或外表的列:

ALTER TABLE Table2 ADD FOREIGN KEY fk3 REFERENCES Table1;

由于没有指定引用列,数据库服务器会在外表 (Table2) 中查找与主表 (Table1) 中的列同名的列。如果存在,数据库服务器会确保数据类型匹配,然后使用这些列创建外键。否则,将在 Table2 中创建这些列。在此示例中,Table2 没有 名为 a 和 b 的列,因此将创建这两个列且数据类型与 Table1.a 和 Table1.b 相同。这些自动创建的列不会成为外表主键的一部分。


 另请参见