SQL (SQL / Oracle) inserta el valor de una declaración de selección usando secuencia

Oct 25 2020

Quiero insertar el valor (user_id) de una declaración de selección como la siguiente sin la columna de identidad. Actualmente, esta consulta no sigue el número de secuencia en orden. Consejo amable.

https://dbfiddle.uk/?rdbms=oracle_18&fiddle=195728e48cc8a5a0047fec8837e9f217

Respuestas

2 MT0 Oct 25 2020 at 23:50

Esto responde a la versión original de la pregunta.

Si está preguntando si puede tener declaraciones SQL idénticas para usar una secuencia en SQL Server y en Oracle, entonces no, no puede.

En Oracle, la sintaxis es:

INSERT INTO b_user ( user_id /*, ... */ )
  VALUES ( b_user__user_id__seq.NEXT_VAL /*, ... */ );

En SQL Server, la sintaxis es:

INSERT INTO b_user ( user_id /*, ... */ )
  VALUES ( NEXT VALUE FOR b_user__user_id__seq /*, ... */ );

En Oracle, puede ajustar la llamada a la secuencia en una función:

CREATE FUNCTION get_next_b_user_id RETURN INT
IS
BEGIN
  RETURN b_user__user_id__seq.NEXTVAL;
END;
/

Entonces podrías usar:

INSERT INTO b_user ( user_id /*, ... */ )
  VALUES ( get_next_b_user__id__seq() /*, ... */ );

Sin embargo, en el servidor SQL no se puede utilizar una secuencia en funciones definidas por el usuario, por lo que el enfoque en Oracle no se puede replicar.


Entonces, en resumen, tendrá que usar diferentes declaraciones SQL para las diferentes bases de datos si está usando una secuencia.

Si desea utilizar una IDENTITYcolumna, puede obtener la misma sintaxis en ambas.

En 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)
);

y en 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)
)

Luego, en ambas bases de datos, puede usar la declaración:

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 y SQL Server db <> fiddle

1 hkandpal Oct 25 2020 at 23:48

una opción es, si sabe que la columna user_id ya tiene algunos valores insertados, cuando cree una secuencia que vaya a utilizar para esa columna

--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 mejor tener una clave principal o una restricción única en esa columna.