如何定义“非唯一”约束,在INSERT上声明现有值?

问题描述

更新:我现在驳回了此问题背后的想法,并主张采用其他设计。但是,给出的答案就目前的问题而言是一个很好的答案。我很高兴接受了。


我想在sql Server中实现与UNIQUE constraint相反的功能

必须确保在新行的INSERT上,已有的某个值已被重新用于特定的列(否则必须创建使用新值的行,请参见下面的注释):

INSERT INTO [dbo].[Item]
       (/*...*/
       [LogicalId])
VALUES
       (/*...*/
       123)
GO

如果LogicalId的值不在现有值中,则必须失败。

由于此值来自SEQUENCE,因此我尝试使用此CONSTRAINT添加SEQUENCE子句,如下所示:

ALTER TABLE Item  
ADD CONSTRAINT chkInsertNonUniqueLogicalId 
CHECK 
(
    ( LogicalId <= (SELECT current_value FROM sys.sequences WHERE name = 'SQ_LogicalId') ) AND
    ( LogicalId >= (SELECT minimum_value FROM sys.sequences WHERE name = 'SQ_LogicalId') ) 
);  
GO  

但这会导致错误

在这种情况下不允许子查询。仅允许标量表达式

使用INSERT命令插入新行时,如何断言同一列上的现有值?

注意:应该使用NULL插入应该具有新逻辑ID(尚未使用的值)的行,从而导致插入上述序列的DEFAULT约束)。这样做的原因是拥有数据库控制(而非用户控制)的逻辑ID。

解决方法

当您以自己的方式描述它时,这似乎是一个奇怪的要求,但是,因为这是因为您从错误的角度看待它。您在这里所追求的肯定是外键约束,似乎您正在丢失包含外键的表。

因此,您需要创建所述表,然后创建外键约束。

user.model.ts:3:25 - error TS7016: Could not find a declaration file for module 'moment-timezone'. '/home/bunthai/sftp/upgrade/projectg/ui/ctr/node_modules/moment-timezone/index.js' implicitly has an 'any' type.
  Try `npm install @types/moment-timezone` if it exists or add a new declaration (.d.ts) file containing `declare module 'moment-timezone';`

import * as moment from 'moment-timezone';
                          ~~~~~~~~~~~~~~~~~