【发布时间】:2012-04-04 12:43:29
【问题描述】:
我有一个 SQL Server 表:
+----+-------------+-------------------+
| ID | CompanyID | CompanyCode |
+----+-------------+-------------------+
| 1 | 1 | AAAA-123 |
| 2 | 2 | BBBB-111 |
| 3 | 1 | AAAA-123 |
| 4 | 3 | CCCC-999 |
| 5 | 3 | CCCC-999 |
| 6 | 1 | AAAA-123 |
+----+-------------+-------------------+
ID 字段是 PK。
CompanyID 和 CompanyCode 字段指定一个唯一的公司,其中 CompanyID 将始终具有相同的 CompanyCode(反之亦然),并且没有两个公司将具有相同的 CompanyID 和/或 @ 987654328@.
我想在表上创建一条规则,如果/当CompanyCode 与现有CompanyCode 不匹配而CompanyID 匹配时,将永远不允许将记录添加到表中。
以下是我不允许在桌子上发生的示例:
+----+-------------+-------------------+
| ID | CompanyID | CompanyCode |
+----+-------------+-------------------+
| 1 | 1 | AAAA-123 |
| 2 | 1 | BBBB-111 |<<<< This record should not be allowed
| 3 | 1 | AAAA-123 |
| 4 | 3 | CCCC-999 |
| 5 | 3 | CCCC-999 |
| 6 | 1 | AAAA-123 |
+----+-------------+-------------------+
注意ID=2 的记录,CompanyCode BBBB-111 与现有的CompanyCode of AAAA-123 记录不匹配。
我希望这条规则以某种方式存在于表中 - 即我不希望这条规则成为查询和/或存储过程必须管理的业务规则。
我想你可以说我想要强制重复记录(在 CompanyID 和 CompanyCode 上)当且仅当表中存在现有的 CompanyID 和/或 CompanyCode。
这可以在表格设计级别进行吗?还是我不得不在我的脚本中进行管理?
更新
虽然这与我的 OP 并不真正相关,但从我收到的反馈来看,我想我应该提供一点关于 CompanyID/CompanyCode 表设计的背景知识。
首先,这只是一个模拟表设计,试图解释我的问题——我的真实表与公司无关。
其次,我的真实表是两个 Web 服务之间的中间人,其中 Service1 创建一个 DeviceID 和 Service2 收集一个存在于微型设备中的 SerialNumber。此外,我的真实表还包含该中间人服务器必须处理的许多其他列。
关于这个中间人服务的一个奇怪的事情是,我正在谈论的表必须允许 DeviceID 和 SerialNumber 都为 NULL - 这完全取决于哪个服务首先发送了一条记录......我我说得太多了,偏离了我原来的问题的主题,但我认为我必须澄清我的表格示例,因为我对打破正常化感到非常不满。
【问题讨论】:
-
为什么 CompanyCode 在这里而不在 Company 表中?
-
这就像您在学习规范化时看到的早期示例之一 - 如果 CompanyCode 依赖于 CompanyID(在这种情况下反之亦然),则应该在某处有一个表代表该事实一次,那么只有其中一个键应该出现在上表中。
标签: sql sql-server tsql sql-server-2008-r2 constraints