SQL (SQL / Oracle) fügt mithilfe der Sequenz einen Wert aus einer select-Anweisung ein
Ich möchte einen Wert (user_id) aus einer select-Anweisung wie unten ohne Identitätsspalte einfügen. Derzeit folgt diese Abfrage nicht der Sequenznummer in der angegebenen Reihenfolge. Freundlicher Hinweis.
https://dbfiddle.uk/?rdbms=oracle_18&fiddle=195728e48cc8a5a0047fec8837e9f217
Antworten
Dies beantwortet die Originalversion der Frage.
Wenn Sie fragen, ob Sie identische SQL-Anweisungen haben, um eine Sequenz in SQL Server und in Oracle zu verwenden, können Sie dies nicht.
In Oracle lautet die Syntax:
INSERT INTO b_user ( user_id /*, ... */ )
VALUES ( b_user__user_id__seq.NEXT_VAL /*, ... */ );
In SQL Server lautet die Syntax:
INSERT INTO b_user ( user_id /*, ... */ )
VALUES ( NEXT VALUE FOR b_user__user_id__seq /*, ... */ );
In Oracle können Sie den Aufruf der Sequenz in eine Funktion einschließen:
CREATE FUNCTION get_next_b_user_id RETURN INT
IS
BEGIN
RETURN b_user__user_id__seq.NEXTVAL;
END;
/
Dann könnten Sie verwenden:
INSERT INTO b_user ( user_id /*, ... */ )
VALUES ( get_next_b_user__id__seq() /*, ... */ );
In SQL Server können Sie jedoch keine Sequenz in benutzerdefinierten Funktionen verwenden, sodass der Ansatz in Oracle nicht repliziert werden kann.
Kurz gesagt, Sie müssen unterschiedliche SQL-Anweisungen für die verschiedenen Datenbanken verwenden, wenn Sie eine Sequenz verwenden.
Wenn Sie eine IDENTITYSpalte verwenden möchten, können Sie in beiden die gleiche Syntax erhalten.
In Oracle:
CREATE TABLE b_user (
user_id INT
GENERATED ALWAYS AS IDENTITY,
user_name VARCHAR(250),
user_email VARCHAR(250),
user_address VARCHAR(250),
user_city VARCHAR(50),
user_state VARCHAR(5),
user_country VARCHAR(5),
user_zip VARCHAR(10)
);
und in SQL Server:
CREATE TABLE b_user (
user_id INT IDENTITY(1,1),
user_name VARCHAR(250),
user_email VARCHAR(250),
user_address VARCHAR(250),
user_city VARCHAR(50),
user_state VARCHAR(5),
user_country VARCHAR(5),
user_zip VARCHAR(10)
)
Dann können Sie in beiden Datenbanken die folgende Anweisung verwenden:
insert into b_user (
user_name,
user_email,
user_address,
user_city,
user_state,
user_country,
user_zip
) values (
'Alice',
'[email protected]',
'A house',
'A city',
'STATE',
'ABC',
'ZZ0123'
);
Oracle db <> fiddle und SQL Server db <> fiddle
Eine Option ist, wenn Sie wissen, dass in der Spalte user_id bereits einige Werte eingefügt sind, wenn Sie eine Sequenz erstellen, die Sie für diese Spalte verwenden werden
--example you start with 3 if you know 2 is the maximum value for that column.
CREATE SEQUENCE b_user__user_id__seq start with 3 ;
Es ist besser, einen Primärschlüssel oder eine eindeutige Einschränkung in dieser Spalte zu haben.