我有一个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
和/或CompanyCode
。
我想在桌上创建一个规则,如果/当CompanyCode
与CompanyID
匹配的现有CompanyCode
不匹配时,永不允许将记录添加到表中。
下面是什么,我不能让餐桌上出现一个例子:
+----+-------------+-------------------+
| 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 /企业编码表的设计有点背景。
首先,这只是一个模拟表设计,试图解释我的问题 - 我的真正表与公司无关。
其次,我真正的表是两个web服务之间的中间人,其中服务1创建一个DeviceID
和服务2 收集一个SerialNumber
存在于微器件。另外,我真正的表格还包含了这个中间人服务器必须处理的许多其他列。
这个中间人服务的一个奇怪的事情是,我说的表必须允许NULLS DeviceID和SerialNumber - 这一切都取决于哪个服务先发送记录....我说的太多了,而且还没有解决我原来的问题,但我认为我必须澄清我的表格示例,因为我正在为突破的标准化问题争论不休。
为什么公司代码在这里,而不是在公司的表? – 2012-04-04 12:45:59
这就像您在学习规范化时显示的早期示例之一 - 如果CompanyCode依赖于CompanyID(反之亦然,在这种情况下),应该有一个表格代表该事实一次,然后只有其中一个键应该出现在上表中。 – 2012-04-04 12:56:59