Як створити таблицю зі стовпцем, що використовує послідовність?


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на пом'якшення цього з компромісом більш повільної продуктивності для об'єкта послідовності.

Створіть посилання на послідовність


Чи безпечно це використовувати cacheу цьому випадку? За посиланням підключення Microsoft каже нам використовувати no cache.
BrunoLM

@BrunoLM Це залежить від того, наскільки великий / маленький db ми говоримо і скільки транзакцій в секунду / хвилину ми говоримо.
Течі Джо

2

Для того, щоб використовувати SEQUENCEв INSERTзаяві, ви можете спробувати це:

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

NEXT VALUE FOR dbo.MyTableIDє синтаксисом для отримання наступного числа з a 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.