Come faccio a creare una tabella con una colonna che utilizza una sequenza?


10

Ho il seguente

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

Voglio inserire nuovi record su MyTable e impostare l'ID sul valore successivo della sequenza. Come posso farlo? Un grilletto forse, o c'è qualche altro modo? Come?

Poiché sto usando SQL Server 2012, non voglio usare Identity a causa del bug gap .

Risposte:


16

Assegnalo come proprietà predefinita per la colonna

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

Lettori futuri, una sequenza può avere un divario se il servizio si arresta in modo imprevisto, il valore delle entità in CACHE può essere perso. Qui, stanno specificando no cachedi mitigarlo con il compromesso delle prestazioni più lente per l'oggetto sequenza.

Riferimento CREATE SEQUENCE


È sicuro da usare cachein questo caso? Al collegamento di connessione Microsoft ci dice di usare no cache.
BrunoLM,

@BrunoLM Dipende da quanto grande / piccolo di un db stiamo parlando e da quante transazioni al secondo / minuto stiamo parlando.
Techie Joe,

2

Per usare a SEQUENCEin INSERTun'istruzione, puoi provare questo:

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

NEXT VALUE FOR dbo.MyTableIDè la sintassi per ottenere il numero successivo da a SEQUENCE.


0

È possibile utilizzare una sequenza per più tabelle, come dimostrato dal seguente esempio:

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

Produzione:

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

sqlfiddle

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.