Bagaimana cara membuat tabel dengan kolom yang menggunakan urutan?

10

Saya punya yang berikut ini

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

Saya ingin menyisipkan catatan baru di MyTable dan mengatur ID ke nilai urutan berikutnya. Bagaimana saya bisa melakukannya? Pemicu mungkin, atau ada cara lain? Bagaimana?

Karena saya menggunakan SQL Server 2012, saya tidak ingin menggunakan Identity karena bug celah .

BrunoLM
sumber

Jawaban:

16

Tetapkan sebagai properti default untuk kolom

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

Pembaca masa depan, Sequence dapat memiliki celah jika layanan berhenti secara tak terduga, nilai entitas dalam CACHE bisa hilang. Di sini, mereka menentukan no cacheuntuk mengurangi itu dengan tradeoff kinerja yang lebih lambat untuk objek urutan.

BUAT referensi SEQUENCE

billinkc
sumber
Apakah aman untuk digunakan cachedalam kasus ini? Di tautan hubungkan, Microsoft memberi tahu kami untuk menggunakan no cache.
BrunoLM
@ BrunoLM Tergantung pada seberapa besar / kecil db yang kita bicarakan dan berapa banyak transaksi per detik / menit yang kita bicarakan.
Techie Joe
2

Untuk menggunakan SEQUENCEdalam INSERTpernyataan, Anda bisa mencoba ini:

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

NEXT VALUE FOR dbo.MyTableIDadalah sintaks untuk mendapatkan nomor berikutnya dari a SEQUENCE.

Techie Joe
sumber
0

Anda dapat menggunakan satu urutan untuk beberapa tabel, seperti yang ditunjukkan oleh contoh berikut:

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

Keluaran:

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

sqlfiddle

Esperento57
sumber