Wie erstelle ich eine Tabelle mit einer Spalte, die eine Sequenz verwendet?


9

Ich habe folgendes

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

Ich möchte neue Datensätze in MyTable einfügen und die ID auf den nächsten Wert der Sequenz setzen. Wie kann ich es tun? Ein Auslöser vielleicht, oder gibt es einen anderen Weg? Wie?

Da ich SQL Server 2012 verwende, möchte ich wegen des Lückenfehlers keine Identität verwenden .

Antworten:


16

Weisen Sie es als Standardeigenschaft für die Spalte zu

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

Zukünftige Leser, eine Sequenz kann eine Lücke haben, wenn der Dienst unerwartet beendet wird, kann der Wert der Entitäten in CACHE verloren gehen. Hier spezifizieren sie no cache, um dies durch den Kompromiss einer langsameren Leistung für das Sequenzobjekt zu mildern.

SEQUENZ- Referenz ERSTELLEN


Ist die Verwendung cachein diesem Fall sicher ? Unter dem Verbindungslink fordert Microsoft uns auf, zu verwenden no cache.
BrunoLM

@BrunoLM Es hängt davon ab, wie groß / klein eine Datenbank ist und über wie viele Transaktionen pro Sekunde / Minute wir sprechen.
Techie Joe

2

Um ein SEQUENCEin einer INSERTAnweisung zu verwenden, können Sie Folgendes versuchen:

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

NEXT VALUE FOR dbo.MyTableIDist die Syntax zum Abrufen der nächsten Nummer von a SEQUENCE.


0

Sie können eine Sequenz für mehrere Tabellen verwenden, wie das folgende Beispiel zeigt:

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

Ausgabe:

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

sqlfiddle

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.