【问题标题】:SQL Server (2008) Creating link tables with unique rowsSQL Server (2008) 创建具有唯一行的链接表
【发布时间】:2009-02-02 14:56:16
【问题描述】:

我无法与 SQL Server Managemen Studio 2008 取得联系!我想创建一个链接表,将一个事件链接到许多受众 (EventAudience)。

可以包含的数据示例:

事件ID |受众 ID

  4              1
  5              1
  4              2

但是,我不想要这个:

事件ID |受众 ID

  4              1
  4              1

我一直在关注关系和约束……但到目前为止还没有快乐!

作为问题的第二部分,我想设置 Audience 表,这样如果从 Audience 中删除一行,它将以级联方式清除 EventAudience 链接表。

一如既往,感谢任何帮助/建议!

谢谢 皮特

【问题讨论】:

    标签: sql-server database database-design


    【解决方案1】:

    只需使用:

    CREATE UNIQUE INDEX UQ_EventAudience ON dbo.EventAudience(EventID, AudienceID);
    

    【讨论】:

      【解决方案2】:

      您应该能够在 EventId 和 AudienceID 上创建复合 UNIQUE 约束。

      此表与具有 CASCADE DELETE 的 Audience 表之间的外键关系应该处理您的第二部分。

      【讨论】:

        【解决方案3】:

        如果您在表格设计器中进行编辑,您可以 ctrl 单击两列并将其设置为主键。那似乎总是对我有用。

        【讨论】:

          【解决方案4】:

          还可以使这些 id 成为表的复合主键。由于主键需要唯一性。

          CONSTRAINT [PK_EventIdAudienceId] PRIMARY KEY CLUSTERED 
          ( [EventId] ASC, [AudienceId] ASC )
          

          【讨论】:

            【解决方案5】:

            替代建议:使用触发器。

            伪代码...

            在链接表上创建更新触发器...
            如果记录不存在,则创建它,否则退出。

            删除的想法相同

            又是伪代码

            在受众表上创建删除触发器...
            从受众表中删除项目
            定位和删除链接表中的引用。

            对不起,它是伪代码,我手边没有 SQL 服务器来查找语法,所以我不想误导。

            【讨论】:

            • 因提供替代建议而被否决?行。谢谢你。
            • 我没有投反对票,但我想这是因为与唯一索引相比,触发器的性能较差,并且更难调试和维护。仅仅因为你可以用不同的方式来做这件事并不意味着它是一个好主意。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多