Создание первичного ключа в таблице Использование значений из других таблиц - PullRequest
0 голосов
/ 16 марта 2019

Мне нужно создать и иметь возможность редактировать способ создания идентификатора таблицы.Предположим, у меня есть две таблицы:

CREATE TABLE [dbo].[Consecutives]
(
        [Consecutives_ID] [INT] IDENTITY(1,1) NOT NULL,
        [Name] [VARCHAR](100) NULL,
        [Value] [INT] NOT NULL,
        [Prefix] [VARCHAR] NOT NULL,
        CONSTRAINT PK_Consecutives PRIMARY KEY (Consecutives_ID)
);

CREATE TABLE [dbo].[Users]
(
        [User_ID] [INT] NOT NULL PRIMARY KEY,
        [LogIn] [VARCHAR](100) NULL,
        [Pass] [VARCHAR](100) NOT NULL,
        CONSTRAINT PK_Users PRIMARY KEY (User_ID)
);

. Есть ли способ создать первичный ключ в таблице Users с использованием префикса и значений в последовательной таблице и увеличить его один разон использует это значение? (через ограничение? или это возможно только через хранимые процедуры?)

Например, имея эту вставку в таблице «Последовательность»:

INSERT INTO [dbo].[Consecutives] ([Name], [Value], [Prefix]) 
VALUES (Users, 50, "USR-")

, и я пытаюсьсоздайте нового пользователя, сгенерированное значение USER_ID будет «USR-50», а значение таблицы «Последовательность» обновится до «51»

1 Ответ

0 голосов
/ 17 марта 2019
DROP TRIGGER IF EXISTS [dbo].[primary_key]
GO

DROP TABLE IF EXISTS [dbo].[Users]
GO

DROP TABLE IF EXISTS [dbo].[Consecutives]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Consecutives](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [varchar](100) NULL,
    [Value] [int] NOT NULL,
    [Prefix] [varchar](100) NOT NULL,
 CONSTRAINT [PK_Consecutives] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Users](
    [ID] [varchar](50) NOT NULL,
    [LogIn] [varchar](100) NULL,
    [Pass] [varchar](100) NOT NULL,
 CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO


SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [dbo].[primary_key] 
   ON  [dbo].[Users]
   AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;
    DECLARE @id varchar(50);
    DECLARE @nextid int;
    SELECT @id = (SELECT TOP 1 Prefix + cast(Value as varchar) FROM Consecutives);
    SELECT @nextid = (SELECT TOP 1 Value + 1 FROM Consecutives);

    UPDATE Users SET ID = @id WHERE ID = (SELECT ID FROM inserted);
    UPDATE Consecutives SET Value = @nextid;

END
GO
ALTER TABLE [dbo].[Users] ENABLE TRIGGER [primary_key]
GO

INSERT INTO Consecutives ([Name], [Value], [Prefix]) 
VALUES ('Users', 50, 'USR-');

INSERT INTO Users([ID],[LogIn],[Pass])
VALUES('one','login1','pass1');

INSERT INTO Users([ID],[LogIn],[Pass])
VALUES('two','login2','pass2');

INSERT INTO Users([ID],[LogIn],[Pass])
VALUES('three','login3','pass3');

SELECT * FROM Users;
SELECT * FROM Consecutives;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...