1、逻辑执行顺序:从上到下,先有后走
2、否则报错:"对象名无效"、"外键 'FK__学生表__6CD828CA' 引用了无效的表 '宿舍表'"
CREATE TABLE 学生表( 学号 char(8) primary key, 楼号 char(2) not null, foreign key(楼号) references 宿舍表(楼号), ); CREATE TABLE 宿舍表( 楼号 char(2) not null, primary key(楼号), );
3、解决方法:调整建表顺序(先有主键,才可引用外键)
CREATE TABLE 宿舍表( 楼号 char(2) not null, primary key(楼号), ); CREATE TABLE 学生表( 学号 char(8) primary key, 楼号 char(2) not null, foreign key(楼号) references 宿舍表(楼号), );
二、1:1多个单一外键引用不同表单一主键
(1)例题:
Create table 图书表( 书号 nchar(6) primary key, ) Create table 书店表( 书店编号 nchar(6) primary key, ) Create table 图书销售表( 书号 nchar(6) not null, 书店编号 nchar(6) not null, 销售日期 smalldatetime not null, primary key(书号,书店编号,销售日期), foreign key(书号) references 图书表(书号), foreign key(书店编号) references 书店表(书店编号) )
(2)删表:得先删有引用外键约束的表
三、n:m复合外键引用同一表复合主键
(1)1:n不符合语法逻辑,报错:在被引用表 '宿舍表' 中没有与外键 'FK__学生表__楼号__793DFFAF' 中的引用列列表匹配的主键或候选键。
CREATE TABLE 宿舍表( 楼号 char(2) not null, 宿舍号 char(3) not null, primary key(楼号,宿舍号), ); CREATE TABLE 学生表( 学号 char(8) primary key, 楼号 char(2) not null, 宿舍号 char(3) not null, foreign key(楼号) references 宿舍表(楼号), foreign key(宿舍号) references 宿舍表(宿舍号), );
(2)解决方法:同一表复合外键对应引用同一表复合主键
CREATE TABLE 宿舍表( 楼号 char(2) not null, 宿舍号 char(3) not null, primary key(楼号,宿舍号), ); CREATE TABLE 学生表( 学号 char(8) primary key, 楼号 char(2) not null, 宿舍号 char(3) not null, foreign key(楼号,宿舍号) references 宿舍表(楼号,宿舍号),