2016-08-16 39 views
0

我試圖將新的文本書記錄插入到數據庫中。我有一個Course表,列ID(PK),CourseID,CourseTitle嘗試將記錄插入到表中錯誤FK T-SQL

textBook表(所有列,ID(PK))是多對多的關係,所以多個課程可以有相同的書籍,課程也可以有多個不同的書籍。

當我嘗試使用C#將新的教科書插入到我的數據庫中時,出現外鍵錯誤。 Course表是父項,Textbook表是子項。兩個表中的ID列都被設置爲標識和自動增量。 ID是我的textBook表中引用Course表的我的外鍵。

這是我的中間表。

CREATE TABLE [dbo].[BookCourse] 
(
[cID] INT NOT NULL Unique, 
[BookID] INT NOT NULL Unique, 
[BookCourseID] INT NOT NULL, 
CONSTRAINT [PK_BookCourse] PRIMARY KEY ([BookCourseID]) 
) 

這裏是我的課本表

CREATE TABLE [dbo].[textBooks] (
[thirteenISBN] VARCHAR (255) NOT NULL, 
[CourseID]  VARCHAR (50) NOT NULL, 
[BookTitle]  VARCHAR (255) NULL, 
[Ancillary]  VARCHAR (255) NULL, 
[BookActive]  VARCHAR (20) NULL, 
[ActiveDate]  VARCHAR (50) NULL, 
[InactiveDate] VARCHAR (50) NULL, 
[Author]   VARCHAR (255) NULL, 
[Imprint]  VARCHAR (100) NULL, 
[Publisher]  VARCHAR (100) NULL, 
[EditionAndDate] VARCHAR (120) NULL, 
[tenISBN]  VARCHAR (255) NULL, 
[VendorISBN]  INT   NULL, 
[ebookAvailable] VARCHAR (50) NULL, 
[eISBN]   VARCHAR (255) NULL, 
[Notes]   VARCHAR (255) NULL, 
[BookID]    INT   IDENTITY (1, 1) NOT NULL, 
CONSTRAINT [PK_textBooks] PRIMARY KEY CLUSTERED ([BookID] ASC), 
CONSTRAINT [FK_textBooks_ToTable] FOREIGN KEY ([BookID]) REFERENCES [BookCourse]([BookID]) 
); 

這是我的課程表

CREATE TABLE [dbo].[Course] (
[CourseID] VARCHAR (50) NOT NULL, 
[CourseTitle] VARCHAR (255) NULL, 
[cID]   INT   IDENTITY (1, 1) NOT NULL, 
CONSTRAINT [PK_Course] PRIMARY KEY CLUSTERED ([cID] ASC), 
CONSTRAINT [FK_Course_ToTable] FOREIGN KEY ([cID]) REFERENCES [BookCourse]([cID]) 
); 

表適配器與插入:

JUTDMSTableAdapters.textBooksTableAdapter bookTableAdapter; 
bookTableAdapter = new JUTDMSTableAdapters.textBooksTableAdapter(); 

JUTDMSTableAdapters.CourseTableAdapter courseTableAdapter; 
courseTableAdapter = new JUTDMSTableAdapters.CourseTableAdapter(); 

courseTableAdapter.Insert(CourseID: txtCourseID.Text, CourseTitle: txtCourseTitle.Text); 

bookTableAdapter.Insert(thirteenISBN: txt13ISBN.Text, CourseID: txtCourseID.Text, BookTitle: txtBookTitle.Text, Ancillary: txtAncillary.Text, 
      BookActive: txtBookActive.Text, ActiveDate: txtActiveDate.Text, InactiveDate: txtInactiveDate.Text, Author: txtAuthor.Text, 
      Imprint: txtImprint.Text, Publisher: txtPublisher.Text, EditionAndDate: txtEditionDate.Text, 
      VendorISBN: vendISBN, tenISBN: txt10ISBN.Text, ebookAvailable: txtEBookAvailable.Text, eISBN: txtEISBN.Text, Notes: txtNotes.Text); 

我在Course表適配器想通插件ERT我就不必添加CID欄看到它是自動遞增,但我得到這個錯誤:

Additional information: The INSERT statement conflicted with the FOREIGN KEY constraint "FK_Course_ToTable". The conflict occurred in database "F:\HUTDMS V-2.0\HUTDMS V-2.0\APP_DATA\HUTDMS.MDF", table "dbo.BookCourse", column 'cID'.

的BookID教科書中的表是自動增量 CID的課程表是自動增量 BookCourseID在BookCourse表是自動增量。

+0

您能澄清表格結構嗎?提供所有相關表格的完整創建腳本,因爲提供的描述很混亂。 – Anton

+0

我使用設計視圖在本地數據庫的Visual Studio中創建了表。兩張桌子,一個有課程信息,另一個只是書的特點。 (isbn,有效日期,無效日期,電子書可用等...) – Norque

+0

它並不重要,你創建它。例如。如果您將對象部署到SQL Server,則可以通過SSMS輕鬆編寫腳本。根據您提供的信息,表格設計不正確。對於多對多的關係,您必須使用三個表格,書桌,課程表和中間表 - BookCourse表。您首先將書籍添加到書籍表中,然後將課程添加到課程表格中,最後將該對(CourseID,BookID)添加到BookCourse表格中。 – Anton

回答

1

對於多對多的關係,您需要使用三個表格,書桌,課程表和中間表 - BookCourse表。 Book table指Book Course,Course Table指Book Course。書和課程表之間沒有直接引用

您首先將書籍添加到書籍表中,然後將課程添加到課程表中,最後將該對(CourseID,BookID)添加到BookCourse表中。

至於BookCourse表,您可以添加複合主鍵(CourseID,BookID),或添加身份關鍵BookCourseID,但如果後者需要確保沒有重複 - 您可以創建一個唯一的約束。

https://en.wikipedia.org/wiki/Many-to-many_(data_model)

+0

我創建了BookCourse Table並創建了BookCourseID的一列。然後,我將我的書和課程表中的「ID」列更改爲BookCourseID。 BookCourseID是我在所有3個表中的PK,並被設置爲身份,因此它自動遞增,但我仍然收到外鍵相同的錯誤?我非常困惑。感謝您的幫助,這非常有意義 – Norque

+0

BookCourseID(PK)應該只出現在BookCourse表中。當您爲3本現有書籍(BookID = {1,2,3})創建新課程時,首先向課程表插入一個條目(例如CourseID = 10),然後將三個條目插入BookCourse表(1,10),(2 ,10),(3,10)。當你有一本新書爲2個現有課程(CourseID = {21,22})時,首先插入Book表的一個入口(例如BookID = 50),然後兩個入BookCourse表(50,21),(50,22)。只有兩個參考資料(書<-> BookCourse)和(Course <-> BookCourse) – Anton

+0

所以如果我在這裏正確地理解你,我認爲我在我的BookCourse Table中應該有BookCourseID(PK),BookID,CourseID。那麼在我的課程表中,我有一個課程ID,在我的書桌中,我有一個書本ID,然後在我的書本表中,我的外鍵是BookID?課程外鍵是CourseID?他們必須參考一個主鍵 – Norque

相關問題