2016-08-09 188 views
0

Bei einer Tabelle dieses Format basiert Anstiege:Spalte, die auf Fremdschlüssel

Primary | Foreign 
1  | 1 
2  | 1 
3  | 1 
4  | 2 
5  | 2 
6  | 3 
7  | 4 

Ist es möglich, eine Spalte zu beschreiben, die als „Ordnung“ oder „Sequenz“ Spalte für jede Instanz des ausländischen handeln würde Schlüssel? Etwas, das wie so verhalten würde:

Primary | Foreign | Seq 
1  | 1   | 1 
2  | 1   | 2 
3  | 1   | 3 
4  | 2   | 1 
5  | 2   | 2 
6  | 3   | 1 
7  | 4   | 1 

Insbesondere, ich suche die die Tabelle hat diskrete Werte in dieser Spalte, aber mit der Fähigkeit, zu ändern, um sie zu definieren. Ich kann dieses Verhalten von der Anwendung aus verwalten, habe mich aber gefragt, ob die Standardwerte am Ende der Datenbank verwaltet werden könnten. Also, ich würde für einige Magie suchen, die diese Arbeit machen würden:

CREATE TABLE "MY_TABLE" 
     ( 
      "PRIMARY" NUMBER NOT NULL, 
      "FOREIGN" NUMBER NOT NULL, 
      "SEQUENCE" NUMBER DEFAULT SOME_MAGIC(SECONDARY, PRIMARY), 
      CONSTRAINT MY_TABLE_PK PRIMARY KEY ("PRIMARY"), 
      CONSTRAINT MY_TABLE_FK FOREIGN KEY ("FOREIGN") 
      REFERENCES "SOME_OTHER_TABLE" ("PRIMARY") 
     ) 

Antwort

3

Sicher, verwendet row_number:

select primary, secondary, 
     row_number() over (partition by secondary order by primary) seq 
from yourtable 
+0

ist es möglich, zu definieren, eine Spalte auf diese Weise aber mit echten diskreten Werten , wie vielleicht mit der Standardklausel. Etwas wie 'ALTER TABLE" MY_TABLE " HINZUFÜGEN (SEQUENZNUMMER DEFAULT SOME_FUNCTION (SEKUNDÄRE))' –

+1

@MatthewGraves - [nicht wirklich] (http://docs.oracle.com/cd/E11882_01/server.112/e41084/ Anweisungen_7002.htm # SQLRF54459); Sie könnten versuchen, es mit einem Trigger zu halten, aber das ist böse. Sie können eine Wrapper-Ansicht erstellen, die den Wert im laufenden Betrieb generiert, oder wenn Sie basierend darauf eine materialisierte Ansicht abfragen müssen, die dasselbe tut, könnte die Leistung besser sein. –

+0

@AlexPoole, yeah, ich kann es in der Anwendung pflegen, ich war nur neugierig, ob es eine Möglichkeit gab, es in der db zu tun. –