[英]SQL Server - why the foreign keys aren't connecting to the primary key
我想將主鍵插入其所有外鍵。 我更改了程序,但仍然得到null或空行:
[ 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
)。
您的原始查詢以兩種方式將圖像和故事連接起來:
Stories
表中的imgID2
列 imgID3
和StoryID3
列imagesInStories
表。 我認為連接圖像和故事的一種方法就足夠了,這就是為什么我在談論重新設計的原因。 每個故事最多都有一個圖片嗎? 如果是這樣,則刪除表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.