sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server 2005 - använder genererade sekvenser istället för identitetskolumner?

Ja, SQL 11 har SEQUENCE-objekt, se SQL Server v.Next (Denali) :Använder SEQUENCE .

Att skapa manuella sekvenser är möjligt, men rekommenderas inte. Tricket att göra en sekvensgenerator är att använda UPPDATERA MED UTGÅNG på en sekvenstabell. Här är pseudokod:

CREATE TABLE Sequences (
    Name sysname not null primary key, 
    Sequence bigint not null default 0);
GO

CREATE PROCEDURE sp_getSequence
    @name sysname,
    @value bigint output
AS
    UPDATE Sequences
    SET Sequence = Sequence + 1
     OUTPUT @value = INSERTED.Sequence
    WHERE Name = @name;
GO

Jag utelämnade några detaljer, men detta är den allmänna idén. Det finns dock ett stort problem:alla transaktioner som begär nästa värde i en sekvens kommer att låsa den sekvensen tills den commit, eftersom den kommer att placera ett uppdateringslås på sekvensvärdet. Det betyder att alla transaktioner måste serialiseras efter varandra när värden infogas och den prestandaförsämring som resulterar är outhärdlig i verkliga produktionsinstallationer.

Jag skulle mycket hellre att du skulle hålla dig till IDENTITETStyperna. Även om de inte är perfekta, är de mycket bättre än vad du kan uppnå på egen hand.



  1. Regex mönster inuti SQL Ersätt funktion?

  2. CONV() – Konvertera tal mellan olika baser i MySQL

  3. Syntax för indataparametrar i en MySQL-fråga

  4. Alternativ till NOT IN på MySQL