Jak utworzyć tabelę z kolumną, która używa sekwencji?

10

Mam następujące

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

Chcę wstawić nowe rekordy na MyTable i ustawić identyfikator na następną wartość sekwencji. Jak mogę to zrobić? Może wyzwalacz, czy jest jakiś inny sposób? W jaki sposób?

Ponieważ korzystam z programu SQL Server 2012, nie chcę używać tożsamości z powodu błędu luki .

BrunoLM
źródło

Odpowiedzi:

16

Przypisz ją jako domyślną właściwość kolumny

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

Przyszli czytelnicy, Sekwencja może mieć lukę, jeśli usługa zostanie nieoczekiwanie zatrzymana, wartość jednostek w CACHE może zostać utracona. Tutaj określają, no cacheaby zminimalizować to dzięki kompromisowi wolniejszej wydajności dla obiektu sekwencji.

TWORZENIE SEQUENCE odniesienie

billinkc
źródło
Czy cachew tym przypadku można bezpiecznie używać ? Pod linkiem Connect Microsoft nakazuje nam użyć no cache.
BrunoLM,
@BrunoLM Zależy to od tego, jak duża / mała db, o której mówimy, oraz o liczbie transakcji na sekundę / minutę, o których mówimy.
Techie Joe,
2

Aby użyć SEQUENCEw INSERTinstrukcji, możesz spróbować:

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

NEXT VALUE FOR dbo.MyTableIDto składnia uzyskiwania następnej liczby z SEQUENCE.

Techie Joe
źródło
0

Możesz użyć jednej sekwencji dla wielu tabel, jak pokazano w poniższym przykładzie:

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

Wynik:

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

sqlfiddle

Esperento57
źródło