2008-12-08 4 views

Antwort

27
CREATE TABLE [dbo].[Foo](
    [FooId] [int] IDENTITY(1,1) NOT NULL, 
    [BarId] [int] IDENTITY(1,1) NOT NULL 
) 

kehrt

Msg 2744, Level 16, State 2, Line 1 
Multiple identity columns specified for table 'Foo'. Only one identity column per table is allowed. 

Also, nein, kann man nicht zwei Identitätsspalten haben. Sie können natürlich den Primärschlüssel nicht automatisch erhöhen (Identität).

Edit: msdn:CREATE TABLE (Transact-SQL) und CREATE TABLE (SQL Server 2000):

nur eine Identitätsspalte kann pro Tabelle erstellt werden.

+1

Ich habe das versucht, aber oft kann eine Einstellung geändert werden, weshalb ich die Frage gestellt habe. –

+0

Es ist durch Spezifikt. Siehe den hinzugefügten Link zu msdn. –

0

In SQL-Server ist es nicht möglich, mehr als eine Spalte als Identität zu haben.

1

Der Primärschlüssel muss keine Identitätsspalte sein.

Sie können nicht zwei Identity-Spalten haben.

Sie etwas bekommen könnte nah an, was Sie mit einem Trigger wollen ...

+0

Dies ist problematisch. Ein Primärschlüssel lässt keine Nullwerte zu. Normalerweise werden automatisch generierte Schlüssel bei Einfügungen weggelassen. Selbst wenn Sie einen Trigger mit INSTEAD OF INSERT verwenden, um Ihren Primärschlüssel zu generieren, wird er kotzen (Getestet auf SQLSEVER2000) –

+1

@ snmcdonald: Verwenden Sie nicht SQL Server 2000 im Jahr 2011. – abatishchev

5

eine Identitätsspalte hinzufügen und dann eine berechnete Spalte, deren Formel hinzuzufügen, ist der Name der Identitätsspalte

Jetzt

beide zur gleichen Zeit erhöht wird
3

Nein, es ist nicht möglich, mehr zu haben, als eine Identitätsspalte

Mit dem Enterprise Manager können Sie nicht einmal> 1 Spalte als Identität festlegen. Wenn eine zweite Spalte Identität gemacht wird

Beachten Sie auch, dass @@ Identität den letzten Identitätswert für die offene Verbindung zurückgibt, die bedeutungslos wäre, wenn mehr als eine Identitätsspalte für eine Tabelle möglich wäre.

2
create table #tblStudent 
(
    ID int primary key identity(1,1), 
    Number UNIQUEIDENTIFIER DEFAULT NEWID(), 
    Name nvarchar(50) 
) 

Zwei Identitätsspalte nicht möglich ist, aber wenn Sie eine eindeutige Kennung Spalte zu verwenden, akzeptieren, um dann dieser Code macht die gleiche Arbeit als gut. Außerdem benötigen Sie eine zusätzliche Spalte namens Spalte zum Einfügen von Werten.

Beispiel Nutzung:

insert into #tblStudent(Name) values('Ali') 

select * from #tblStudent 

Ps: NewID() Funktion erstellt einen eindeutigen Wert vom Typ Unique.

0

Ich habe gerade einen Code erstellt, mit dem Sie zwei Identitäten in derselben Tabelle einfügen können.lassen Sie es mich mit Ihnen in Fall teilen es hilft:

create trigger UpdateSecondTableIdentity 
On TableName For INSERT 
as 
update TableName 
set SecondIdentityColumn = [email protected]@IDENTITY 
where ForstId = @@IDENTITY; 

Danke,

16

Sie Sequenz für die zweite Spalte mit Standardwert verwenden, wenn Sie SQL Server 2012

--Create the Test schema 
CREATE SCHEMA Test ; 
GO 

-- Create a sequence 
CREATE SEQUENCE Test.SORT_ID_seq 
    START WITH 1 
    INCREMENT BY 1 ; 
GO 

-- Create a table 
CREATE TABLE Test.Foo 
    (PK_ID int IDENTITY (1,1) PRIMARY KEY, 
    SORT_ID int not null DEFAULT (NEXT VALUE FOR Test.SORT_ID_seq)); 
GO 

INSERT INTO Test.Foo VALUES (DEFAULT) 
INSERT INTO Test.Foo VALUES (DEFAULT) 
INSERT INTO Test.Foo VALUES (DEFAULT) 

SELECT * FROM Test.Foo 

-- Cleanup 
--DROP TABLE Test.Foo 
--DROP SEQUENCE Test.SORT_ID_seq 
--DROP SCHEMA Test 
verwenden

http://technet.microsoft.com/en-us/library/ff878058.aspx

+0

Guter Vorschlag, nur Problem ist Trunkierung der Tabelle. – GoldBishop

+0

Ich bin mir nicht sicher, dass Trunkierung ein Problem ist, wenn Sie [Sequenz zurücksetzen] (https://msdn.microsoft.com/en-us/library/ff878572.aspx#code-snippet-7) möchten, können Sie tun Sie das leicht – benkevich

+0

Ja, aber im Gegensatz zu der Identity-Kennung müssen Sie entweder die Sequenz löschen und dann neu hinzufügen oder durchlaufen und neu definieren den Start für die Sequenz. Für die Entwicklung und/oder das Testen ist Sequence keine ideale Implementierung. Sobald Sie die Entwicklungs-/Testphase hinter sich haben, ist dies eine äußerst nützliche Implementierung. Nur ein PITA während der Entwicklungsstufen – GoldBishop

-1

Eine Problemumgehung wäre, einen INSERT-Trigger zu erstellen, der einen Zähler erhöht.

Also habe ich eine Tabelle, die eine Identität col: applicationstatusid hat. es ist auch der Primärschlüssel. Ich möchte automatisch eine andere Spalte erhöhen: applicationnumber

Also das ist der Auslöser, den ich schreibe.

create trigger [applicationstatus_insert] on [ApplicationStatus] after insert as 
     update [Applicationstatus] 
     set [Applicationstatus].applicationnumber =(applicationstatusid+ 4000000) 
     from [Applicationstatus] 
     inner join inserted on [applicationstatus].applicationstatusid = inserted.applicationstatusid 
+0

CREATE Sequence unten ermöglicht es Ihnen, einen Standardwert festzulegen, der automatisch inkrementiert. Vor 2012 könnten Sie eine Funktion verwenden, die einen Wert in einer Tabelle erhöht und zurückgibt (ähnlich wie in Ihrer Antwort). Und das könnte ein Standardwert für eine Spalte sein. Auslöser sollten vermieden werden. – TamusJRoyce

Verwandte Themen