繁体   English   中英

检查约束引用另一个表上的唯一列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM