使用外键SQL插入值

时间:2016-02-10 13:07:06

标签: sql-server database

我正在尝试插入具有外键的数据。我能够使用GUID更新前两个表,但我在最后3个表中无法更新我想要更新

    BEGIN TRANSACTION;

    DECLARE @myid uniqueidentifier
    SET @myid = NEWID()

    INSERT INTO [SERVER].[DB].[Pod] (id)
    VALUES (@myid)

    INSERT INTO [SERVER].[DB].[RackPattern] ([id])
    VALUES (@myid)

    INSERT INTO [SERVER].[DB].[PhysicalServer] ([serialNumber], [rackPosition],[Rack_id], id)
    VALUES ('2327', '25', 'DBedc1001r01', @myid)

    INSERT INTO [SERVER].[DB].[Rack] ([Site_id], [Pod_id], [RackPattern_id], id)
    VALUES ('Datacenter','PostionID', 'RACK_PATTERN_ID_1', @myid)

    INSERT INTO [SERVER].[DB].[Site] (Pod_id, id)
    VALUES ('PostionID', @myid)

    COMMIT;

结果:

(1 row(s) affected)  

(1 row(s) affected)  
  

Msg 547,Level 16,State 0,Line 11
  INSERT语句与FOREIGN KEY约束“FK__PhysicalS__Rack___00DF2177”冲突。冲突发生在数据库“VCO01-A_PATTERN_DB”,表“DB.Rack”,列'id'中。

     

Msg 547,Level 16,State 0,Line 14
  INSERT语句与FOREIGN KEY约束“FK__Rack__Site_id__6BE40491”冲突。冲突发生在数据库“VCO01-A_PATTERN_DB”,表“DB.Site”,列“id”中。

     

Msg 547,Level 16,State 0,Line 17
  INSERT语句与FOREIGN KEY约束“FK__Site__Pod_id__4F47C5E3”冲突。冲突发生在数据库“VCO01-A_PATTERN_DB”,表“DB.Pod”,列“id”中。

1 个答案:

答案 0 :(得分:0)

好吧,你在第三个语句中向PhysicalServer插入了一些内容,引用了具有特定ID的Rack - 但Rack表中的插入只发生在第四个语句 - 这样当您运行第三个SQL语句时Rack.Id还没有(还)存在!对于第五个语句也是如此 - 您使用Site插入id - 但您已在第四个语句中引用该表....

这只是以正确的顺序插入的问题 - 试试这个:

BEGIN TRANSACTION;

DECLARE @myid uniqueidentifier
SET @myid = NEWID()

INSERT INTO [SERVER].[DB].[Pod] (id)
VALUES (@myid)

INSERT INTO [SERVER].[DB].[RackPattern] ([id])
VALUES (@myid)

-- insert into SITE 
INSERT INTO [SERVER].[DB].[Site] (Pod_id, id)
VALUES ('PostionID', @myid)

-- insert into RACK, referencing the SITE
INSERT INTO [SERVER].[DB].[Rack] ([Site_id], [Pod_id], [RackPattern_id], id)
VALUES ('Datacenter', 'PostionID', 'RACK_PATTERN_ID_1', @myid)

-- NOW you can insert into "PhysicalServer" which references the rack ...
INSERT INTO [SERVER].[DB].[PhysicalServer] ([serialNumber], [rackPosition],[Rack_id], id)
VALUES ('2327', '25', 'DBedc1001r01', @myid)

COMMIT;

但是还有可疑的东西......

在第三个声明中,您在Site中插入了一些id,其中包含您创建的此GUID。然而,在第四个声明中,您引用SiteId作为数据中心' ......有些事情还没有......