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

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 创建数据库 » 使用数据库对象 » 管理外键

 

管理外键 (SQL)

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

♦  创建外键 (SQL)
  1. 以具有 DBA 权限的用户身份连接到数据库。

  2. 执行 ALTER TABLE 语句。

创建外键时忽略列名 (SQL)

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

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 相同。这些自动创建的列不会成为外表主键的一部分。

示例

在下例中,将创建一个名为 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;
另请参见