[英]Check Constraint Referencing Unique Column on another Table
我想限制可以在列中输入的可用值,但是我想使用的值在另一个表中,这不是该表的主键; 该表的主键未包含在我的表中。
例如,假设我创建了一个用于报告客户的表(列:Id,名称,标题),该表引用了现有的客户标题表(列:Id,标签)。两个表在ID上都有主键。 我希望客户表以文字显示客户的标题,而不是与客户关联的title.Id。 我知道客户标题栏应仅包含标题表中的值。 我无法更改标题表的结构。
这是我考虑过的三个选项,但我不太喜欢:
1.我不能用外键引用title.label列,因为它不是主键。
2.我可以创建一个检查约束并制作一个动态脚本,以在使用标题标签更新customers表之前使用titles表中的值对其进行更新,但这感觉很手工。
DECLARE @TableName VARCHAR(50) = 'Customers'
DECLARE @FieldName VARCHAR(50) = 'Title'
DECLARE @SQL VARCHAR(MAX) = ''
SELECT @SQL = @SQL + '
OR ' + @FieldName + ' = ''' + Label + ''''
FROM dbo.Titles
ORDER BY Label
SELECT @SQL = 'ALTER TABLE dbo.' + @TableName + ' DROP CONSTRAINT chk_Customer' + @FieldName + '
ALTER TABLE dbo.' + @TableName + ' ADD CONSTRAINT chk_Customer_' + @FieldName + ' CHECK
(' + SUBSTRING(@SQL,6,LEN(@SQL)) + ')'
PRINT @SQL
3.我可以保留它,而根本不用约束列,但是我宁愿在可能的地方添加约束,以使所有内容尽可能地减少,并提高查询性能。
因此,问题是这样的:是否有一种内置的方法通过引用另一张表来引用一列(以限制或枚举值),而不必以某种方式编写值; 一旦创建,某些东西将始终保持最新状态,就像外键关系一样,但不必引用主键。
首先,像GordonLinoff注释一样,更好的方法是在Customer
表中包括TitleID
。 如果您无法更改Customer
表的布局,则可以使用以下选项。 foreign key
绝对比使用动态T-SQL保持check
约束最新更好。
我不能用外键引用title.label列,因为它不是主键。
外键可以引用任何候选键。 它不必引用主键。
要告诉数据库候选密钥,您可以创建一个唯一索引:
create table title (
id int primary key,
label varchar(50));
create table customer (
id int primary key,
title varchar(50));
create unique index ux_title_label on title(label);
alter table customer add constraint fk_customer_title
foreign key (title) references title(label);
告诉数据库候选密钥的另一种方法是唯一约束:
alter table title add constraint uc_title_label unique (label);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.