SQL Server 创建设计更好的数据库-外键的放置位置

w6lpcovy  于 2022-12-03  发布在  其他
关注(0)|答案(2)|浏览(119)

假设我的数据库中有2个表,每个表SectionPages有2个Windows窗体(C#)。现在每个Section可以有10个Pages

注意我正在创建Windows窗体应用程序,第一个窗体如下所示

FORM 1 (For Section Table)
pages的第二个形式如下所示:
是的。
通过点击每个Section,用户将被定向到第二个表单,其中用户将/可以有10个页面。
我有这个:
第一个
我不知道如何在创建页面后将数据插入数据库。

再次强调:1节至少可以有10页,1页可以有1个注解。

如果我没有使它更容易理解,请使用微软的一个注意移动的应用程序,我基本上是复制它-谢谢。

s3fp2yjn

s3fp2yjn1#

一旦您将约束引入到模式中,您就需要仔细考虑如何插入数据。
(temp数据表不会胁迫这样的条件约束)

CREATE TABLE #Pages    (PageID INT IDENTITY PRIMARY KEY, PageTitle NVARCHAR(20), NoteID INT)
CREATE TABLE #Sections (SectionID INT IDENTITY PRIMARY KEY, SectionName NVARCHAR(20), PageID INT CONSTRAINT FK_PageID REFERENCES #Pages(PageID))

现在我们有了表,并完成了约束。FK必须存在于被引用的表中。

DECLARE @KeyTable TABLE (PageID INT)

INSERT INTO #Pages (PageTitle, NoteID) 
OUTPUT INSERTED.PageID INTO @KeyTable
VALUES ('Some Page', NULL)

INSERT INTO #Sections (SectionName, PageID) 
SELECT 'Some Section', PageID
  FROM @KeyTable
INSERT INTO #Sections (SectionName, PageID) 
SELECT 'Another Section', PageID
  FROM @KeyTable

当我们插入页面时,我们可以捕获生成的ID(如果它不是一个标识,则提供),并将其保存在表变量中。然后,我们也可以在插入到节中时使用它。当您'实际上,您可能需要构建一些逻辑,检查页面是否已经存在,如果存在,则使用适当的现有PageID填充表变量,或者执行插入并推进PageID如果没有的话。

euoag5mw

euoag5mw2#

节与页之间的关系是1:n.
您可以将其表述为:一节有多页,但一页只有一节。你总是要把外键放在“n”表中,在本例中是“页”。
如果您有这样的数据库,请告诉我您的数据库,我可以为您编写一个精确的sql:

Create Table Section(
  Sectionid int primary key,
  SectionName varchar,
)

Create Table Page(
  Pageid int,
  pagetitle int,
  Noteid int,
  PRIMARY KEY(PageId),
  FOREIGN KEY (SectionId) References Section(SectionId)
)

......但我猜页面标题也是varchar?
如果你想插入数据,这是很容易的节.一个简单的插入语句.如果你想在页面对象中插入数据,你必须为列“SectionId”插入节的id.
示例:

Insert into table Section (Sectionid, SectionName) values (12,'test');
Insert into table Page (Pageid, Sectionid) values(1,12);

您插入的值“12”是区段的ID。

相关问题