2016-08-16 83 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