SQL (SQL / Oracle) fügt mithilfe der Sequenz einen Wert aus einer select-Anweisung ein

Oct 25 2020

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

2 MT0 Oct 25 2020 at 23:50

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

1 hkandpal Oct 25 2020 at 23:48

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.