【问题标题】:Fixed Value for same Composite Key相同复合键的固定值
【发布时间】:2022-01-02 21:37:05
【问题描述】:

我一直在尝试在 Microsoft SQL Server Management Studio 中创建数据库,并且在使用相同的复合键时尝试获得一个固定值。

为了更清楚:

| CrewID | Phone | Email         |
+--------+-------+---------------+
| 565    | 210   | a@hotmail.com |
| 565    | 212   | a@hotmail.com |
| 565    | 213   | a@hotmail.com |
| 935    | 641   | b@hotmail.com |
| 935    | 646   | b@hotmail.com |

基本上CrewIDPhone 是复合键,允许同一个CrewID 使用多个电话号码,但我希望为每个唯一 ID 锁定电子邮件。

因此,每当我输入新数据时,如果 ID 相同,则使用具有该特定 ID 的第一个条目的电子邮件自动填充电子邮件。

【问题讨论】:

  • 请阅读this,了解一些改进问题的技巧。你试过什么?有什么研究吗?也许是 trigger 来验证 insertupdate 上的数据?您有问题还是只是寻求授权?由于表中的行没有顺序,“第一个条目”是什么意思?
  • "但我希望为每个唯一 ID 锁定电子邮件" 哪个唯一 ID?全体人员?电话?两个都?这实际上是一个糟糕的数据库设计,如果您试图阻止多个不同的电子邮件地址,您应该将它们存储在不同的表中(Crew?),而不是建立一种机制来尝试保持它们相同。
  • @DaleK 数据库的重点不在邮件上。坦率地说,这整个想法是可选的,我只是想实现它以最终使数据输入更容易。但尽我所能回答你的问题。我希望相同的 CrewID 使用相同的电子邮件,如上表所示。所以正如HABO所提到的,如果它检测到crewID没有改变,我可能会尝试制作一个自动填充电子邮件列的触发器。我不确定这是否可行。如果没有任何效果,我会按照你说的那样分表。
  • 好像你需要 3 张桌子。一个Crew 表、一个Phone 表和一个“连接”表,用于两个先前表之间的多对多连接。然后你的Email 列进入它实际相关的表中,并且上面有一个UNIQUE INDEX/CONSTRAINT
  • 无论今天的功能多么可选,人们都应该始终正确地设计数据库,否则会为明天带来技术债务。如果您仍然希望按照您说的做,您应该在您的客户端界面中自动填充它,并禁用对添加到同一 CrewID 的任何进一步记录的编辑。

标签: sql sql-server tsql sql-update


【解决方案1】:

我很快就解决了。我最初的想法是保持简单并将电话和工作人员表分开,但我想尝试更高级的东西。最终没有必要。

我只是将PhoneNum (PK)、DescriptionCrewID (FK) 放在一个新表上,并仅使用 CrewID (PK) 和 Email 使 Crew 表保持简单。现在,对于每个唯一的CrewID,我都有一个电子邮件,而Phone 表允许我存储多个电话号码。

【讨论】:

  • 你已经学到了数据库规范化的一课:使用更多的表和关系,并且正确地做事,意味着你不需要为编码打结
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-18
  • 2014-03-09
  • 2016-06-30
  • 1970-01-01
  • 2018-12-05
  • 1970-01-01
相关资源
最近更新 更多