2009-07-29 3 views
0

Kann ein automatisch inkrementierender Primärschlüssel durch künstliche Grenzen eingeschränkt werden? Wenn ich beispielsweise nur Integer-Primärschlüssel aus einem bestimmten Bereich von Ganzzahlen, z. B. zwischen 100 und 999, und automatischem Inkrement verwenden möchte, ist das möglich? Und wenn ja, auf welcher Datenbankserver-Software. Ich bin hauptsächlich an MS SQL Server 2000 oder höher interessiert, aber andere könnten interessant sein.Ist es möglich, einen automatisch inkrementierenden Primärschlüssel mit künstlichen Grenzen zu beschränken?

Antwort

3

Ja, Sie können es mit einer Identitätsspalte tun und eine Check-Einschränkung:

CREATE TABLE test(rowid int identity(100,1) primary key) 
GO 
ALTER TABLE test ADD CONSTRAINT CK_test_Range 
    CHECK (rowid >= 100 AND rowid < 1000) 
GO  
INSERT INTO test default values; 
GO 900  
SELECT * FROM test 
GO  
DROP TABLE test 

Wenn Sie wollen keine Lücken zwischen den ROWIDs, wird es ein wenig komplexer.

0

Versuchen Sie, eine Check-Einschränkung auf den Tisch der Primärschlüssel, um sicherzustellen, gilt:

 
ALTER TABLE MyTable 
ADD CONSTRAINT MyPrimaryKeyConstraint 
CHECK (PrimaryKey >= 100 AND PrimaryKey <= 999) 

Change „MyTable“, um Ihre Tabellennamen „MyPrimaryKeyConstraint“, was auch immer beschreibenden Namen möchten Sie, und „PrimaryKey“ zum Spaltennamen des Primärschlüssels.

+0

Die Verwendung von BETWEEN könnte ein wenig einfacher zu lesen sein: "CHECK (PrimaryKey zwischen 100 und 999)" – SqlRyan

0

Sie können den Startwert mit DBCC CHECKIDENT(<tablename>, RESEED, <newstart>) ändern; Sie können den oberen Bereich mit einer normalen CHECK-Einschränkung einschränken.

2

OK Sie können dies wie oben gezeigt tun, aber beachten Sie, dass je kleiner der Bereich, desto wahrscheinlicher werden Sie den Punkt erreichen, an dem keine Daten in die Tabelle eingegeben werden können, da der Bereich erreicht wurde. Und denken Sie daran, dass jede rückgängig gemachte Transaktion oder gelöschter Datensatz einen Teil der Bandbreite einnimmt. Ich würde sehr ernsthaft darüber nachdenken, bevor ich einen solchen Schritt mache oder ihm zumindest einen Bereich gebe, der viel größer ist als jede mögliche Anzahl von Platten, die Sie jemals in der Tabelle haben werden.

0

Beachten Sie, dass eine IDENTITY-Spalte Lücken in der Zahlenfolge enthalten kann. Nicht verwendete Nummern werden nicht automatisch wiederverwendet. Ein Bereich von 100 bis 999 bedeutet also nicht, dass Ihr Tisch genau 900 Zeilen zulässt - es könnte etwas weniger sein.