SQL (SQL / Oracle) inserta el valor de una declaración de selección usando secuencia
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
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
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.