I want to reserve a range of values for the system like [1-10,000]. The user values should be inserted after 10,000. eg. There is a table that will have values inserted by the system & will also have values inserted by the user. So, when a system inserts, the id’s assigned to it will have to be between 1 to 10,000. If the user inserts a value, the values can be anything greater than 10,000.
Advertisement
Answer
You can use check constraint to ensure the condition has been satisfied:
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);
If the column must be populated automatically, you can use IDENTITY column like this:
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];
Lately, you can use SET IDENTITY_INSERT to add your special records.
If you need more control, you can use trigger – instead of/after INSERT and UPDATE. You can add more logic there – reject the user input or transform the user input. But it feels like an overkill and you need to be careful when creating triggers – always process rows in batches to ensure you are not affecting to much your CRUD performance.