How to create an incremental Update sql command

1

I have a Estoque table where today there are already many rows of records already registered, how can I do an incremental update to populate a column that 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 requirement is that the command causes the Etiqueta column to be populated 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
    
asked by anonymous 27.07.2017 / 15:16

3 answers

2

I think it can be done like this:

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

Give an update to the stock table by selecting the sequential number of the temporary table.

Follow the code below:

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: link

    
27.07.2017 / 15:30
1

How about using a field of type BIGSERIAL :

Creating the table:

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

Inserting the 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 );

Test:

SELECT produto, n_serie, etiqueta FROM Estoque;

Output:

Incaseofexistingdata,IsuggestcreatingaSEQUENCEandaddingaDEFAULTvaluetotheetiquetacolumnpointingtoitsnextvaluenextval():

OriginalTable:

CREATETABLEEstoque(produtoTEXT,n_serieBIGINT,etiquetaBIGINT);

Pre-existingdata:

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

CreatingSEQUENCE:

CREATESEQUENCEseqEstoqueSTART1;

AdjustingthevalueDEFAULToffieldetiqueta:

ALTERTABLEEstoqueALTERCOLUMNetiquetaSETDEFAULTnextval('seqEstoque');

Updatepre-existingdata(%with%):

UPDATEEstoqueSETetiqueta=nextval('seqEstoque');

Test:

    
27.07.2017 / 15:44
0

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

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
    
27.07.2017 / 15:27