无论数据是否提供,我是否可以创建一个在插入时填充列的禁区?

问题描述:

这是一个奇怪的要求。无论数据是否提供,我是否可以创建一个在插入时填充列的禁区?

数据库(SQL)上有一列可以为空。 我有一个限制,填充列是空/默认提供,它从一个序列填充。

是否可以设置一个约束来忽略由insert语句提供的任何数据并始终放入下一个序列值?

我目前的表/约束是:

CREATE TABLE [dbo].[testmembership](
    [id] [int] NOT NULL, 
    [name] [nvarchar](50) NOT NULL, 
    [membershipno] [nvarchar](50) NULL 
) ON [PRIMARY] 


alter table testmembership 
add constraint DF_mytblid 
default 
'PREFIX-'+cast((next value for membershipseq) as nvarchar(50)) 
for membershipno 

如果我做到以下几点:

insert into testmembership (id,name,membershipno) values (12,'test',default) 

它yeilds正确的顺序产生的价值。 不过,我希望它仍然具有即使我把这个序列值:

insert into testmembership (id,name,membershipno) values (12,'test','ignoreme') 
+1

你使用MySQL或MS SQL Server?不要标记不涉及的产品。 – jarlh

+0

您可以使用触发器。 – jarlh

+0

不是100%肯定的,但你可以使用计算列这个 –

我不认为你可以做你想要使用的约束什么,而是你可以定义一个触发器,它取代使用的代替选项正常插入行为:

像这样的东西可能会奏效:

create trigger tr on testmembership instead of insert as 
    insert testmembership (id, name, membershipno) 
    select id, name, 'PREFIX-' + cast((next value for membershipseq) as nvarchar(50)) 
    from inserted; 
+0

有趣的想法,是否有很多使用这种触发器的性能影响? – doodlleus

+0

@doodlleus触发器通常会对性能产生不利影响,但由于这里的逻辑并不复杂,我不担心它,除非您预计需要快速执行大量操作。 – jpw