2017-11-03 2 views
0

Gibt es eine Möglichkeit in Oracle, eine Spalte mit Auto-Inkrement zu erstellen und wenn eine Zeile gelöscht wird der nächste Wert, der gelöscht wurde, sollte die Zeile ersetzen, die gelöscht wird. Gibt es eine Möglichkeit, das in Orakel zu tun?kontinuierliche Werte in Oracle Primärschlüssel

+0

Warum würden Sie das tun? Sie haben eine Sequenz, um diesen inkrementellen Wert für eine Spalte zur Verfügung zu stellen, aber ... um alte Zeilen zu ersetzen, wäre es a) nicht gut für gleichzeitige Benutzer, b) overkill (ziemlich komplex, um nicht in bereits verwendete Werte zu springen Beziehung von Orakel Apex mit Ihrer Frage? – Alfabravo

+0

Sie können Sequenzen in Oracle verwenden, um einen Auto-Inkrement-Wert zu definieren.Sie würden solche Ersetzungen für Primärschlüssel oder IDs nicht verwenden möchten Allerdings hat Oracle eine eingebaute Rowid, die Sie können get by 'Wählen Sie rowid aus your_table_name' – Dean

+0

Mögliche Duplikate von [Wie ID mit AUTO \ _INCREMENT auf Oracle erstellen?] (https://stackoverflow.com/questions/11296361/how-to-create-id-with-auto- increment-on-oracle) –

Antwort

0

Dieses Verhalten, das Sie beschreiben (mit "Löchern" in der Sequenz nach Löschungen), wird immer mit SEQUENCE passieren. Für die meisten Anwendungen ist es eine gute Sache und funktioniert perfekt, weil die id der Tabelle die meiste Zeit künstlich und bedeutungslos ist. Es wird nur verwendet, um Tabellen mit Beziehungen zu verbinden, und dafür sind Lücken unwichtig.

In Ihrem Fall, wenn Sie eine fortlaufende Sequenz erstellen und Lücken füllen möchten, wenn sie erstellt werden, müssen Sie einen Trigger beim Einfügen erstellen, der Ihre ID mit dem Wert des ersten "Lochs" in Ihrer Sequenz aktualisiert ein SELECT wie folgt aus:

SELECT MIN(tb.id) + 1 "first_seq_hole" 
    FROM yourTable tb 
WHERE NOT EXISTS 
(SELECT tb.id FROM yourTable tb2 WHERE tb.id + 1 = tb2.id) 

Obwohl, ich bin nicht sicher, was Ihre Anforderung ist hier aber an einem gewissen Punkt könnte man noch Löcher in der Sequenz haben (sagen Sie 10 zufällige Zeilen löschen und niemals fügen Sie sie zu füllen) . Dies ist jedoch unvermeidbar, es sei denn, Sie arbeiten an einer Möglichkeit, vorhandene IDs zu ändern, um Lücken sofort zu füllen, wenn Zeilen gelöscht werden. Es wäre jedoch kompliziert und riskant, wenn Sie untergeordnete Tabellen verwenden, die diese ID verwenden.

+0

Sorry, aber ich habe die Abfrage nicht viel verstanden, aber ich denke das ist die Antwort auf mein Problem – blank

+0

die Abfrage gibt das erste Loch in einer Sequenz in einem Feld enthalten. Angenommen, Sie haben [1,2,4,6], weil Sie [3] und [5] gelöscht haben, was Sie als nächstes [3] einfügen möchten. Die Abfrage wird erstellt, um zu prüfen, welcher der erste Wert in Ihrer Sequenz ist ('min (tb.id)'), der keinen "folgenden" Wert hat (der "NOT EXISTS" -Teil). Es addiert dann 1 zu diesem Wert und Sie erhalten den ersten freien Wert in Ihrer Sequenz. Sie müssen yourTable durch Ihren Tabellennamen und die ID-Spalte mit Ihrem echten ID-Spaltennamen ersetzen. – Dessma

Verwandte Themen