我想为系统保留一系列值,比如[1-10000]。用户值应在10000之后插入。有一个表,它的值将由系统插入,也将由用户插入。因此,当系统插入时,分配给它的id必须在1到10000之间。如果用户插入一个值,则该值可以是大于10000的任何值。
jvidinwx1#
可以使用“检查约束”来确保满足条件:
DROP TABLE IF EXISTS [dbo].[StackOverflow]; CREATE TABLE [dbo].[StackOverflow] ( [Col01] INT ,CONSTRAINT [CH_StackOverflow] CHECK ([Col01] < 1 OR [Col01] > 10000) ); INSERT INTO [dbo].[StackOverflow] ([Col01]) VALUES (-1); INSERT INTO [dbo].[StackOverflow] ([Col01]) VALUES (1);
如果必须自动填充列,则可以使用如下标识列:
DROP TABLE IF EXISTS [dbo].[StackOverflow]; CREATE TABLE [dbo].[StackOverflow] ( [Col01] INT IDENTITY(10001, 1) ,[Col02] NVARCHAR(12) ); INSERT INTO [dbo].[StackOverflow] ([Col02]) VALUES ('x'); INSERT INTO [dbo].[StackOverflow] ([Col02]) VALUES ('y'); SELECT * FROM [dbo].[StackOverflow];
最近,您可以使用set identity\u insert添加特殊记录。如果需要更多的控制,可以使用trigger-而不是/after insert和update。您可以添加更多的逻辑-拒绝用户输入或转换用户输入。但这感觉像是一种过度杀戮,在创建触发器时需要小心——总是成批处理行,以确保不会对crud性能造成太大影响。
1条答案
按热度按时间jvidinwx1#
可以使用“检查约束”来确保满足条件:
如果必须自动填充列,则可以使用如下标识列:
最近,您可以使用set identity\u insert添加特殊记录。
如果需要更多的控制,可以使用trigger-而不是/after insert和update。您可以添加更多的逻辑-拒绝用户输入或转换用户输入。但这感觉像是一种过度杀戮,在创建触发器时需要小心——总是成批处理行,以确保不会对crud性能造成太大影响。