首页 > 解决方案 > 如何将 1:1 关系转换为 1:N 关系

问题描述

我有一个没有很好实施的数据库 SQL 和一些问题。

1.fk 似乎不能很好地工作我必须进行单独的查询以在所有表​​中添加一个值,

  1. 第一个表很奇怪,但它是正确的,它必须与其他表分开(我要添加、取消、修改)同时在 tab tabList 和 tabSE 中。

  2. 我必须在 tabSE 和 tabSD 之间实现 1:N 关系(不知道该怎么做)实际上目标是选择(形成 c# bla bla bla)一堆项目,单击开始并将信息存储在例如,在 mm/dd/yyyy 的那一天,我用 id (1,5,3,6,8) 开始了项目(通过单击按钮开始),开始得到了结果 bla bla bla,它结束了日 mm/dd/yyyy。我认为Union 可能是没有意义的,从tabSD 可能Nome 我不必存在,不知道。帮助

标签: sql-serverddl

解决方案


从上到下:

  1. 如果您在 tabStoreExec 和 tabStoricoDetail 之间有一个 FK,则您可以自动执行的唯一两件事是UPDATEDELETE使用关键字(或配置表的选项)CASCADE

  2. 我想这是一个“临时”表,用作接口实用程序的背面。

  3. 用于制作 1:N。我认为最好的是删除表 Union,然后您必须在 tabStoricoDetail 上创建一个复合键,例如 id 和 idDetail ,让 FK 完成他的工作,只链接两个表的 id :

    tabStoreExec.idSE -> tabStoricoDetail.id
    

我给你一些CREATE TABLES代码示例,可以按照你的意愿工作:

CREATE TABLE tabStoreExec (
    idSE INT --PRIMARY KEY --Coul be done here, but can't be named
    , nomeItem VARCHAR(100) NOT NULL --or maybe could be NULL
    , DateStarSE DATE --or DATETIME, depends if you want the time too
    , DateEndSE DATE
    , CONSTRAINT PK_tabStoreExec PRIMARY KEY (id)
    , CONSTRAINT FK_tabStoreExec_idSE_id FOREIGN KEY (idSE) REFERENCES tabStoricoDetail(id) ON DELETE CASCADE ON UPDATE CASCADE --use this in case you want to propagate the delete/update action from this table to referenced.
);

CREATE TABLE tabStoricoDetail (
    id INT
    , idDetail INT
    , nomeItem VARCHAR(100) NOT NULL --or maybe could be NULL
    , resItemDet VARCHAR(100)
    , CONSTRAINT PK_tabStoricoDetail PRIMARY KEY (id, idDetail)
); 

我希望这对你有帮助。

编辑: 是的,联合表可以消失。

FK 是两个表之间的“连接器”,它为您提供数据完整性,并且复合 PK 可以具有 1:N 关系。我在这里给你一个示例模式以获得更好的帮助:

示例架构


推荐阅读