SQL Server多个主键与外键、复合主键与外键引用

SQL 小时候可胖了 59℃ 0评论

一、SQL查表语句执行机制

1、逻辑执行顺序:从上到下,先有后走

2、否则报错:"对象名无效"、"外键 'FK__学生表__6CD828CA' 引用了无效的表 '宿舍表'"


1
2
3
4
5
6
7
8
9
CREATE TABLE 学生表(
  学号 char(8) primary key,
  楼号 char(2) not null,
  foreign key(楼号) references 宿舍表(楼号),
);
CREATE TABLE 宿舍表(
  楼号 char(2) not null,
  primary key(楼号),
);

3、解决方法:调整建表顺序(先有主键,才可引用外键)


1
2
3
4
5
6
7
8
9
CREATE TABLE 宿舍表(
  楼号 char(2) not null,
  primary key(楼号),
);
CREATE TABLE 学生表(
  学号 char(8) primary key,
  楼号 char(2) not null,
  foreign key(楼号) references 宿舍表(楼号),
);

?

二、1:1多个单一外键引用不同表单一主键

(1)例题:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
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' 中的引用列列表匹配的主键或候选键。


1
2
3
4
5
6
7
8
9
10
11
12
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)解决方法:同一表复合外键对应引用同一表复合主键


1
2
3
4
5
6
7
8
9
10
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 宿舍表(楼号,宿舍号),

?

?

转载请注明:九层楼 » SQL Server多个主键与外键、复合主键与外键引用

喜欢 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址