2009-08-03 12 views
2

Ich habe eine Tabelle, "foo", in meiner Datenbank mit Primärschlüssel "fooID".Autoincrement-Feld pro Einheit in SQL Server?

Ich habe eine zweite Tabelle, "fooAttributes", mit einem Fremdschlüssel, der auf foo.fooID verweist.

Ich hätte gerne einen zusammengesetzten Schlüssel in der fooAttributes-Tabelle (fooID, attributeNumber), wobei attributeNumber auf einer pro-foo-Basis automatisch erhöht, wenn ich ein neues Attribut einfüge. So hätte foo Nummer 1 die Attribute 1, 2, 3 ... und foo Nummer 2 hätte die Attribute 1, 2, 3 ... etc.

Welche Art von SQL-Fu ist notwendig, um dies zu erreichen? Ist es praktisch? (Ich bin sicher, dass es möglich ist, genug Aufwand gegeben.)

+0

Sie können das in SQL Server ohne viel manuelle Intervention nicht tun. Das IDENTITY-Feld ist tabellenweit, z.B. ist garantiert einzigartig für die ganze Tabelle - nicht für eine bestimmte "fooID". –

Antwort

2

Ich glaube nicht, es gibt eine Möglichkeit, dies automatisch in SQL wie eine Identitätsspalte in MS SQL Server zu tun. Ich würde eine gespeicherte Prozedur erstellen, um diese Weitergabe in der fooID zu übernehmen. Zum Beispiel:

begin tran  
select @attributeNumber = isnull(max(attributeNumber),0)+1 
from fooAttributes where fooID = @fooID 

insert fooAttributes(fooID, attributeNumber) 
values(@fooID, @attributeNumber) 
commit 

Wahrscheinlich nicht das, was Sie wollten. Wenn der automatische Weg möglich ist, möchte ich es auch sehen.

+0

Ich dachte, das würde so etwas wahrscheinlich meine Lösung sein. Wie kann ich Probleme durch zwei gleichzeitige Einfügungen von verschiedenen Benutzern vermeiden? –

+1

Wrapping der Select & einfügen in den "begin tran" und "commit" machen diese Anweisungen in einer einzigen Transaktion, die dieses Problem verhindert. –

1

Klingt wie Sie wollen ein Trigger auf Foo.

auf Einsatz in Foo:

Insert fooAttributes 
select SCOPE_IDENTITY(), attributeId 
from attributes 

Ich gehe davon aus, dass Sie eine Tabelle „Attribute“ genannt haben, die alle Attribute enthält. Wenn nicht, können Sie Ihr eigenes Ding tun, um zu den Attribut-IDs zu gelangen (ein Kreuz-Join auf einem Subselect wäre meine erste Schätzung).

Verwandte Themen