2016-03-21 40 views
0

我有一个“学生”表。我想补充的是,学生有包含的物品袋:添加所需的外键

Students: 
| Id | Name | BagId | 
|----|--------|-------| 
| 0 | Josh | 0 | 
| 1 | Emma | 2 | 

Bags: 
| Id | 
|----| 
| 0 | 
| 1 | 
| 2 | 

Items: 
| BagId | Item | 
|-------|---------| 
|  0 | Banana | 
|  0 | Apple | 
|  1 | Pen  | 
|  1 | Tissue | 
|  2 | Gun  | 

我需要的“包包”表和BagId的,因为我想其他实体比学生能够有一个袋子(但如果你有一个更好的主意,我都耳朵)。

我的问题:

  • 我没有Students.BagId列尚未
  • 我希望它是一个非空的外键
  • 我已经有很多学生
  • 袋表没有填充

=>如何填充袋表并给每个学生BagId创建学生之间。 BagId列和外键约束的应用? (我并不需要填充的项目表,所有的包包都初始为空)

我试图像

UPDATE Students 
SET BagId = t.Id 
FROM (
    INSERT INTO Bags DEFAULT VALUES 
    OUTPUT INSERTED) as t 

没有成功的事情。

我正在使用实体框架6,我想在迁移过程中做所有事情。

+0

线的东西为什么不使用学生证的包包? – Captain0

+0

@Julien你想用Linq查询或编写自定义的sql sql吗? – Rusty

+0

Captain0>因为我想让学生以外的其他实体拥有行李 – Julien

回答

1

假设有没有在包装袋表中的数据还没有,你可以写一个自定义的SQL脚本,你可以做沿

DECLARE @Temp TABLE(
StudentId INT, 
BagId INT IDENTITY(1,1)) 

INSERT INTO @Temp(
    StudentId 
)(
    Select Id 
    from Students 
) 
SET IDENTITY_INSERT Bags ON 
INSERT INTO Bags(
    Id 
)(
    Select BagId 
    From @Temp 
) 
SET IDENTITY_INSERT Bags OFF 

UPDATE Students 
    Set BagId = T.BagId 
FROM Students S 
INNER JOIN @Temp T on T.StudentId = S.Id 

--just to show results 
Select * from Students 
Select * from Bags 
+0

我希望更简单一些,但是那样做, 非常感谢你 ! – Julien