¿Cómo creo una tabla con una columna que usa una secuencia?

10

Tengo lo siguiente

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

Quiero insertar nuevos registros en MyTable y establecer la ID en el siguiente valor de la secuencia. ¿Cómo puedo hacerlo? ¿Un disparador quizás, o hay alguna otra forma? ¿Cómo?

Como estoy usando SQL Server 2012, no quiero usar Identity debido al error gap .

BrunoLM
fuente

Respuestas:

16

Asignarlo como la propiedad predeterminada para la columna

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

Lectores futuros, una secuencia puede tener una brecha si el servicio se detiene inesperadamente, el valor de las entidades en CACHE puede perderse. Aquí, están especificando no cachemitigar eso con la compensación de un rendimiento más lento para el objeto de secuencia.

Referencia CREAR SECUENCIA

billinkc
fuente
¿Es seguro usarlo cacheen este caso? En el enlace de conexión, Microsoft nos dice que usemos no cache.
BrunoLM
@BrunoLM Depende de cuán grande / pequeño de un DB estamos hablando y de cuántas transacciones por segundo / minuto estamos hablando.
Techie Joe
2

Para usar un SEQUENCEen una INSERTdeclaración, puede intentar esto:

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

NEXT VALUE FOR dbo.MyTableIDes la sintaxis para obtener el siguiente número de a SEQUENCE.

Techie Joe
fuente
0

Puede usar una secuencia para varias tablas, como lo demuestra el siguiente ejemplo:

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

Salida:

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

sqlfiddle

Esperento57
fuente