簡體   English   中英

SQL Server-為什么外鍵沒有連接到主鍵

[英]SQL Server - why the foreign keys aren't connecting to the primary key

我想將主鍵插入其所有外鍵。 我更改了程序,但仍然得到null或空行:

dbo.Stories-空 [ 這是桌子 1

其他連接的表都為空。

我的程序:

CREATE PROCEDURE insertText    
    @UserID [INT],
    @story [NVARCHAR](120),
    @img [VARCHAR](MAX)
AS
BEGIN
    INSERT INTO Stories ([StoryText]) 
    VALUES (@story)

    INSERT INTO Images ([img]) 
    VALUES (@img)

    SELECT        
        dbo.Table_Users.UserID , dbo.Stories.StoryID, dbo.Images.imgID
    FROM            
        dbo.Images 
    INNER JOIN
        dbo.imagesInStories ON dbo.Images.imgID = dbo.imagesInStories.imgID3   
    INNER JOIN
        dbo.Stories ON dbo.Images.imgID = dbo.Stories.imgID2 
                    AND dbo.imagesInStories.StoryID3 = dbo.Stories.StoryID 
    INNER JOIN
        dbo.Users_Stories ON dbo.Stories.StoryID = dbo.Users_Stories.StoryID2 
    INNER JOIN
        dbo.Table_Users ON dbo.Users_Stories.ID2 = dbo.Table_Users.UserID
    WHERE 
        dbo.Table_Users.UserID = @UserID
END
GO

-- exec UserStory 3, 'today nothing worked ???', 'meyesterday.jpg'

我希望你明白。

在任何地方都找不到答案

並嘗試了幾天。

您正在兩個不同的表中插入兩個單個值,但是您的查詢似乎表明您需要更多信息來“連接”插入的值。 插入的Story將接收一個StoryID ,而Image將接收一個imgID 假設您的查詢是正確的,則必須按如下所示更改代碼:

CREATE PROCEDURE insertText    
    @UserID [INT],
    @story [NVARCHAR](120),
    @img [VARCHAR](MAX)
AS
BEGIN

    DECLARE @StoryID int, @ImageID int;

    INSERT INTO dbo.Images ([img]) 
    VALUES (@img);

    SET @ImageID = SCOPE_IDENTITY();

    INSERT INTO dbo.Stories ([StoryText], imgID2) 
    VALUES (@story, @ImageID);

    SET @StoryID = SCOPE_IDENTITY();

    INSERT INTO dbo.imagesInStories (StoryID3, imgID3)
    VALUES (@StoryID, @ImageID);

    INSERT INTO dbo.Users_Stories (ID2, StoryID2)
    VALUES (@UserID, @StoryID);

    SELECT  Table_Users.UserID , Stories.StoryID, Images.imgID
    FROM  dbo.Images 
    INNER JOIN
        dbo.imagesInStories ON Images.imgID = imagesInStories.imgID3   
    INNER JOIN
        dbo.Stories ON Images.imgID = Stories.imgID2 
                    AND imagesInStories.StoryID3 = Stories.StoryID 
    INNER JOIN
        dbo.Users_Stories ON Stories.StoryID = Users_Stories.StoryID2 
    INNER JOIN
        dbo.Table_Users ON Users_Stories.ID2 = Table_Users.UserID
    WHERE 
        Table_Users.UserID = @UserID
END

您可能應該重新設計表結構:故事和圖像似乎以兩種方式鏈接:直接1:n和通過表imagesInStories m:n。

添加:

我聲明了變量@StoryID@ImageID以在使用SCOPE_IDENTITY()系統函數插入新記錄后立即存儲兩個表的標識列的值。 @ImageID插入故事時,該圖像屬於是必要的,並且新@StoryID添加圖像層的連接(到當需要imagesInStories表)並添加新的故事時,用戶的故事(表Users_Stories )。

您的原始查詢以兩種方式將圖像故事連接起來:

  1. 使用“ Stories表中的imgID2
  2. 同時使用imgID3StoryID3imagesInStories表。

我認為連接圖像和故事的一種方法就足夠了,這就是為什么我在談論重新設計的原因。 每個故事最多都有一個圖片嗎? 如果是這樣,則刪除表imagesInStories ,否則,從Stories表中刪除imgID2列。 但是,您的查詢使用兩種方法,當有多個圖像鏈接到一個故事時,這將返回不完整的結果,因為查詢將僅返回ID已保存在“ Stories表的imgID2列中的一個圖像。

我從代碼中刪除了所有這部分,它的工作原理完全一樣!

 SELECT  Table_Users.UserID , Stories.StoryID, Images.imgID
FROM  dbo.Images 
INNER JOIN
    dbo.imagesInStories ON Images.imgID = imagesInStories.imgID3   
INNER JOIN
    dbo.Stories ON Images.imgID = Stories.imgID2 
                AND imagesInStories.StoryID3 = Stories.StoryID 
INNER JOIN
    dbo.Users_Stories ON Stories.StoryID = Users_Stories.StoryID2 
INNER JOIN
    dbo.Table_Users ON Users_Stories.ID2 = Table_Users.UserID
WHERE 
    Table_Users.UserID = @UserID

有必要嗎? PS :您的意思是:“您可能應該重新設計表結構:故事和圖像似乎以兩種方式鏈接:直接通過1:image進行n:n,通過表imagesInStories通過m:n進行鏈接”-我不明白你能解釋一下嗎?

我對這個SQL還是那么陌生。 感謝您的回答

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM