Comment créer un tableau avec une colonne qui utilise une séquence?

10

J'ai le suivant

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

Je veux insérer de nouveaux enregistrements sur MyTable et définir l'ID à la valeur suivante de la séquence. Comment puis-je le faire? Un déclencheur peut-être, ou y a-t-il un autre moyen? Comment?

Étant donné que j'utilise SQL Server 2012, je ne souhaite pas utiliser Identity en raison du bogue d'écart .

BrunoLM
la source

Réponses:

16

Attribuez-la comme propriété par défaut pour la colonne

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

Futurs lecteurs, une séquence peut avoir un écart si le service s'arrête de façon inattendue, la valeur des entités dans CACHE peut être perdue. Ici, ils spécifient no cachepour atténuer cela avec le compromis de performances plus lentes pour l'objet séquence.

CRÉER LA SÉQUENCE référence

billinkc
la source
Est-il sûr d'utiliser cachedans ce cas? Sur le lien de connexion, Microsoft nous dit d'utiliser no cache.
BrunoLM
@BrunoLM Cela dépend de la taille de la grande / petite base de données dont nous parlons et du nombre de transactions par seconde / minute dont nous parlons.
Techie Joe
2

Pour utiliser un SEQUENCEdans une INSERTinstruction, vous pouvez essayer ceci:

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

NEXT VALUE FOR dbo.MyTableIDest la syntaxe pour obtenir le nombre suivant à partir de a SEQUENCE.

Techie Joe
la source
0

Vous pouvez utiliser une séquence pour plusieurs tables, comme le montre l'exemple suivant:

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

Production:

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

sqlfiddle

Esperento57
la source