How to create an incremental Update sql command

Asked

Viewed 1,525 times

1

I have a table Estoque where today there are already numerous rows of records already registered, how can I do an Incremental Update to fill a column that I added the table now?

Produto | N_Serie | Etiqueta
    A   |   123   |   NULL
    B   |   456   |   NULL
    C   |   789   |   NULL
    D   |   101   |   NULL
    E   |   112   |   NULL
    F   |   131   |   NULL

My need is for the command to make the column Etiqueta be filled incrementally so that in the end it looks like this:

Produto | N_Serie | Etiqueta
    A   |   123   |    1
    B   |   456   |    2
    C   |   789   |    3
    D   |   101   |    4
    E   |   112   |    5
    F   |   131   |    6

3 answers

2


I believe it can be done like this:

Create a temporary table, using the row_number() function to number the rows.

Update the stock table by selecting the sequential number from the temporary table.

Follows code:

with temp as (
select 
Produto, 
N_Serie, 
Row_number() over(order by Produto asc) as linha
from estoque )

update estoque set etiqueta = (select t.linha from temp t where t.produto = estoque.produto and t.n_serie = estoque.n_serie );

Postgresql functions: https://www.postgresql.org/docs/8.4/static/functions-window.html

  • I need to select all columns from the original table to create this temporary table?

  • I believe not, just the keys

  • 1

    It worked, thank you very much for your help

  • for nothing, have

1

How about using a field of the type BIGSERIAL:

Table creation:

CREATE TABLE Estoque
(
    produto TEXT,
    n_serie BIGINT,
    etiqueta BIGSERIAL
);

Data entry:

INSERT INTO Estoque ( produto, n_serie ) VALUES ( 'A', 123 );
INSERT INTO Estoque ( produto, n_serie ) VALUES ( 'B', 456 );
INSERT INTO Estoque ( produto, n_serie ) VALUES ( 'C', 789 );
INSERT INTO Estoque ( produto, n_serie ) VALUES ( 'D', 101 );
INSERT INTO Estoque ( produto, n_serie ) VALUES ( 'E', 112 );
INSERT INTO Estoque ( produto, n_serie ) VALUES ( 'F', 131 );

Testing:

SELECT produto, n_serie, etiqueta FROM Estoque;

Exit:

inserir a descrição da imagem aqui

In the case of existing data, I suggest the creation of a SEQUENCE and the inclusion of a DEFAULT in the column etiqueta pointing to its next value nextval():

Original Table:

CREATE TABLE Estoque
(
    produto TEXT,
    n_serie BIGINT,
    etiqueta BIGINT
);

Pre-existing data:

INSERT INTO Estoque ( produto, n_serie ) VALUES ( 'A', 123 );
INSERT INTO Estoque ( produto, n_serie ) VALUES ( 'B', 456 );
INSERT INTO Estoque ( produto, n_serie ) VALUES ( 'C', 789 );
INSERT INTO Estoque ( produto, n_serie ) VALUES ( 'D', 101 );
INSERT INTO Estoque ( produto, n_serie ) VALUES ( 'E', 112 );
INSERT INTO Estoque ( produto, n_serie ) VALUES ( 'F', 131 );

inserir a descrição da imagem aqui

Creation of SEQUENCE:

CREATE SEQUENCE seqEstoque START 1;

Value adjustment DEFAULT country etiqueta:

ALTER TABLE Estoque ALTER COLUMN etiqueta SET DEFAULT nextval('seqEstoque');

Updating of pre-existing data (UPDATE):

UPDATE Estoque SET etiqueta = nextval('seqEstoque');

Testing:

inserir a descrição da imagem aqui

  • The problem is that as the lines are already filled I need it to be an Update even in this new column

  • @R.Santos Following edition

  • Good idea too +1

0

In MSSQL, I would use the row_number command, as the example below. Try this way or some similar command in your SQL version

create table #Temp1 (Produto varchar(1), N_Serie int, Etiqueta  int)

insert #Temp1
values
   ('A'   ,   123   ,    null ),
   ('B'   ,   456   ,    null ),
   ('C'   ,   789   ,    null ),
   ('D'   ,   101   ,    null ),
   ('E'   ,   112   ,    null ),
   ('F'   ,   131   ,    null )

-- ==================
-- Exibindo o resultado do insert
-- ==================

select * from #Temp1

-- ==================
-- Criando a nova Temp
-- ==================
select Produto, N_Serie, Row_number() over(order by Produto asc) as linha
       into #NovaTabela
  from #Temp1

update a
   set a.Etiqueta = b.linha
  from #Temp1 a 
  join #NovaTabela b on a.Produto = b.Produto

-- ==================
-- Conferindo o resultado
-- ==================
select * from #Temp1

Browser other questions tagged

You are not signed in. Login or sign up in order to post.