Как мне создать таблицу со столбцом, который использует последовательность?


10

У меня есть следующее

CREATE TABLE [MyTable]
(
    [ID] [bigint] PRIMARY KEY NOT NULL,
    [Title] [nvarchar](64) NOT NULL
)

CREATE SEQUENCE MyTableID
    START WITH 1
    INCREMENT BY 1
    NO CACHE
    ;
GO

Я хочу вставить новые записи в MyTable и установить идентификатор для следующего значения последовательности. Как мне это сделать? Триггер, может быть, или есть какой-то другой способ? Как?

Поскольку я использую SQL Server 2012, я не хочу использовать Identity из-за ошибки пробела .

Ответы:


16

Назначьте его как свойство по умолчанию для столбца

CREATE TABLE [MyTable]
(
    [ID] [bigint] PRIMARY KEY NOT NULL DEFAULT (NEXT VALUE FOR dbo.MyTableID),
    [Title] [nvarchar](64) NOT NULL
);

У будущих читателей последовательность может иметь разрыв, если служба неожиданно останавливается, значение объектов в CACHE может быть потеряно. Здесь они указывают, no cacheчтобы уменьшить это с компромиссом более медленной производительности для объекта последовательности.

Ссылка CREATE SEQUENCE


Безопасно ли использовать cacheв этом случае? По ссылке подключения Microsoft говорит нам использовать no cache.
BrunoLM

@BrunoLM Это зависит от того, какой большой / маленький дБ мы говорим и сколько транзакций в секунду / минуту мы говорим.
Технарь Джо

2

Чтобы использовать SEQUENCEв INSERTзаявлении, вы можете попробовать это:

INSERT INTO [MyTable] ([ID],[TITLE]) VALUES (NEXT VALUE FOR dbo.MyTableID, @TITLE) 

NEXT VALUE FOR dbo.MyTableIDэто синтаксис для получения следующего числа из SEQUENCE.


0

Вы можете использовать одну последовательность для нескольких таблиц, как показано в следующем примере:

CREATE SEQUENCE dbo.MyTableID
    START WITH 1
    INCREMENT BY 1
    NO CACHE
    ;
GO

CREATE TABLE dbo.[MyTable1]
(
    [ID] [bigint] PRIMARY KEY NOT NULL DEFAULT (NEXT VALUE FOR dbo.MyTableID),
    [Title1] [nvarchar](64) NOT NULL
);

CREATE TABLE dbo.[MyTable2]
(
    [ID] [bigint] PRIMARY KEY NOT NULL DEFAULT (NEXT VALUE FOR dbo.MyTableID),
    [Title2] [nvarchar](64) NOT NULL
);

--Insert 2 rows
insert into  [MyTable1] (title1)
select 'title11'

insert into  [MyTable1] (title1)
select 'title12';

insert into  [MyTable2] (title2)
select 'title21'

insert into  [MyTable2] (title2)
select 'title22';

select f1.*, 'Into MyTable1' Tb from  [MyTable1] f1
union all
select f1.*, 'Into MyTable2' Tb from  [MyTable2] f1

Вывод:

+----+---------+---------------+
| ID | Title1  |      Tb       |
+----+---------+---------------+
|  1 | title11 | Into MyTable1 |
|  2 | title12 | Into MyTable1 |
|  3 | title21 | Into MyTable2 |
|  4 | title22 | Into MyTable2 |
+----+---------+---------------+

sqlfiddle

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.