[SQL] Kolom met 0'en veranderen naar 1,2,3 etc.

Pagina: 1
Acties:
  • 241 views sinds 30-01-2008
  • Reageer

  • Xof
  • Registratie: Juni 2001
  • Laatst online: 22:41
Echt een duidelijk topictitel kon ik niet verzinnen, maar volgens mij is het nog redelijk duidelijk :D

Ik heb een kolom met data die 12.000 records bevat, daarnaast heb ik een kolom waarvan alle 12.000 records de waarde 0 hebben. Nu wil ik graag die kolom met nullen veranderen in 1 t/m 12.000... hoe pak ik dit aan?

Klein voorbeeldje:

0 123213
0 123123
0 23423
0 435436
0 3453453

Eerste kolom moet dus zijn 1, 2, 3, 4, 5

Kun je met sql query's ook een soort van loops gebruiken oid? Ik ben al een hele tijd bezig en kom er niet uit. Er is jammer genoeg ook niks over te vinden.

Verwijderd

verander de eerste kolom in int auto_increment, Iets in de geest van ALTER TABLE <naam> CHANGE <veldnaam> <veldnaam> int auto_increment;

http://dev.mysql.com/doc/mysql/en/ALTER_TABLE.html

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 17-12-2025

curry684

left part of the evil twins

Als je SQL server hebt:
SQL:
1
2
3
declare @index int;
set @index = 1;
update MyTable set row_id = @index, @index = @index + 1;

En klaar is klara :)

Loops kun je ook nog gebruiken via cursors, maar deze manier is een stuk cleaner.

Professionele website nodig?


  • Xof
  • Registratie: Juni 2001
  • Laatst online: 22:41
Ik mag de kolom dus niet auto_increment maken. Tenminste niet uniek, want dat begint die te zeuren dat de velden niet uniek zijn ivm de nullen. Als ik hem niet op uniek instel en dan ALTER ga gebruiken gebeurt er nog niks :(

  • Xof
  • Registratie: Juni 2001
  • Laatst online: 22:41
curry684 schreef op 30 september 2004 @ 14:18:
Als je SQL server hebt:
SQL:
1
2
3
declare @index int;
set @index = 1;
update MyTable set row_id = @index, @index = @index + 1;

En klaar is klara :)

Loops kun je ook nog gebruiken via cursors, maar deze manier is een stuk cleaner.
hmm dan geeft die nog alles dezelfde cijfer :s
Als ik die nog een keer run geeft die alles cijfer 2 bijv. dat is ook niet de bedoelding.. ik ga ff kijken of ik wat met deze code kan iig :)

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 17-12-2025

curry684

left part of the evil twins

Ik had gehoopt dat "als je SQL Server hebt" duidelijk genoeg als hint was dat we er geen bal mee kunnen als we niet weten welk RDBMS je hebt :z

Professionele website nodig?


  • Xof
  • Registratie: Juni 2001
  • Laatst online: 22:41
Ik gebruik mySQL :)
Maar ik dacht dat zo'n stukje code voor elke SQL database wel hetzelfde was :)

  • d00d
  • Registratie: September 2003
  • Laatst online: 16-09-2025

d00d

geen matches

Het update statement is 'set based'. Je zult dus een cursor moeten gebruiken om deze 'row based' update te doen.

Zoek even in de help op "cursor" en je komt er vast wel uit.
(Ook in de veronderstelling dat je SQL Server gebruikt)

42.7 percent of all statistics are made up on the spot.


Verwijderd

een 'klein' scriptje schrijven, die je eenmaal uitvoerd?
PHP:
1
2
3
4
5
for($i = 1; $i <= 12000; $i++)
{
  $query = "UPDATE table SET nummer = $i WHERE nummer = 0 LIMIT 0,1";
  mysql_query($query);
}

of in welke taal dan ook

dit duurt waarschijnlijk een paar minuten, dus de timeout tijd van de php server moet wel op meer dan 30 seconden staan, en backup even je database voordat je dit soort bewerkingen gaat doen :P

edit
ow ik bedenk me nog wat :), delete die rij met nullen, en voeg vervolgens dezelfde rij toe maar nu wel met auto_increment

[ Voor 22% gewijzigd door Verwijderd op 30-09-2004 14:35 ]


  • Xof
  • Registratie: Juni 2001
  • Laatst online: 22:41
Verwijderd schreef op 30 september 2004 @ 14:33:
een 'klein' scriptje schrijven, die je eenmaal uitvoerd?
PHP:
1
2
3
4
5
for($i = 1; $i <= 12000; $i++)
{
  $query = "UPDATE table SET nummer = $i WHERE nummer = 0 LIMIT 0,1";
  mysql_query($query);
}

of in welke taal dan ook

dit duurt waarschijnlijk een paar minuten, dus de timeout tijd van de php server moet wel op meer dan 30 seconden staan, en backup even je database voordat je dit soort bewerkingen gaat doen :P

edit
ow ik bedenk me nog wat :), delete die rij met nullen, en voeg vervolgens dezelfde rij toe maar nu wel met auto_increment
moet ik apache ed. gaan installeren.. heb ik opzich niet zo'n zin in, maar als het anders niet lukt dan ga ik het idd maar zo doen.

Ik ga es zoeken op cursors :)

edit: dat met deleten en opnieuw toevoegen met auto_increment heb ik al geprobeerd maar dat lukt jammer genoeg niet :'(

[ Voor 9% gewijzigd door Xof op 30-09-2004 14:36 ]


  • cavey
  • Registratie: Augustus 2000
  • Laatst online: 17-02 19:31
je kan het wel op auto_increment zetten door er nog een "WITH NOCHECK" statement bij te pleuren (in geval van SQL server).

ow, mysql?

hmm

heb je er nog een scripttaal aanvast zitten? Want dan kan je gemakkelijk een loopje schrijven in bijv. php ...
(hoef je niet eens via een webpagina te doen... terminalletje, php commandline interpreter gebruiken en daar je php file voor gebruiken... ala shell scripts).

want dan kan je gewoon iets van

$res = mysql_query("select * from tabel");

<wat php magic om het bijv. in een array te hebben ofzo>

$i = 0;

foreach $res
{
set id = $i++;
}

Hmm

ach, wtf, waarom stop je er niet gewoon een auto_incrementing kolom bij en drop je de kolom met alle 0-waardes?

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 22:42

TeeDee

CQB 241

Ben ik nou compleet idioot als ik zeg:

- maak een nieuwe tabel, eerste kolom op auto_inc.

en dan eens met
SQL:
1
SELECT column_name(s) INTO newtable FROM source

aan de slag gaan

[ Voor 6% gewijzigd door TeeDee op 30-09-2004 14:41 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • cavey
  • Registratie: Augustus 2000
  • Laatst online: 17-02 19:31
Xof schreef op 30 september 2004 @ 14:35:
[...]


moet ik apache ed. gaan installeren.. heb ik opzich niet zo'n zin in, maar als het anders niet lukt dan ga ik het idd maar zo doen.
dat is toch wel behoorlijke onzin wat je daar uitkraamt.

PHP is een scripttaal/omgeving, dat het toevalligerwijs een module heeft voor apache c.q. geintegreerd kan worden met apache doet daar niks aan af.

Het werkt hetzelfde als perl of dood ordinaire shell scripts....

je hebt gewoon een losse binary "php" of "php3" of "php4" (of whatever) en daar kan je als parameter een php-file meegeven die dan wordt uitgevoerd.

Heb je echt geen apache voor nodig........

[ Voor 4% gewijzigd door cavey op 30-09-2004 14:41 ]


  • Xof
  • Registratie: Juni 2001
  • Laatst online: 22:41
komakeef schreef op 30 september 2004 @ 14:41:
[...]


dat is toch wel behoorlijke onzin wat je daar uitkraamt.

PHP is een scripttaal/omgeving, dat het toevalligerwijs een module heeft voor apache c.q. geintegreerd kan worden met apache doet daar niks aan af.

Het werkt hetzelfde als perl of dood ordinaire shell scripts....

je hebt gewoon een losse binary "php" of "php3" of "php4" (of whatever) en daar kan je als parameter een php-file meegeven die dan wordt uitgevoerd.

Heb je echt geen apache voor nodig........
Nou als ik php installeer dan vraagt die bijv. om apache ed.

Ik heb er nu geen script taal oid aanvast zitten omdat er een win32 applicatie omheen geprogrammeerd gaat worden. Waarom zou ik dan gaan klooien met php?

  • cavey
  • Registratie: Augustus 2000
  • Laatst online: 17-02 19:31
hoeft ook niet.... dan schrijf je het met een vbscript met mysql koppelingen ofzo. weet ik het.

PHP heeft gewoon handige mysql functies built-in (maja, moet je het wel meecompileren). Brengt me meteen op een ander punt: Ik was er van uit gegaan dat je een *nix flavour draaide.. dan is het installeren van php niet zo'n punt (en dan hoef je echt geen apache mee te installeren ofzo). Mijn fout iig, gedeeltelijk ;)

Maar kan je niet gewoon een kolom toevoegen, die auto_increment is en primary key? Dan zou die toch de boel automagic moeten bijnummeren? kan je later die 0 kolom droppen.

Of zoals TeeDee aangeeft........ insert into andere tabel die wel auto_increment id veld heeft (velden) select records from andere tabel....

[ Voor 12% gewijzigd door cavey op 30-09-2004 14:57 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 17-12-2025

curry684

left part of the evil twins

d00d schreef op 30 september 2004 @ 14:32:
Het update statement is 'set based'. Je zult dus een cursor moeten gebruiken om deze 'row based' update te doen.

Zoek even in de help op "cursor" en je komt er vast wel uit.
(Ook in de veronderstelling dat je SQL Server gebruikt)
Update is niet set-based :) Probeer jij die code van mij maar eens uit in SQL Server, werkt perfect: dat is juist een van de trucs waardoor je enorm remmende cursors kunt omzeilen.

Ook een leuke in dat gebied:
SQL:
1
2
declare @recipients varchar(4096);
select @recipients = @recipients + email + ';' from users;

Hier komt netjes een ;-separated string van alle mailadressen uit :)

Professionele website nodig?


  • Xof
  • Registratie: Juni 2001
  • Laatst online: 22:41
komakeef schreef op 30 september 2004 @ 14:56:
Maar kan je niet gewoon een kolom toevoegen, die auto_increment is en primary key? Dan zou die toch de boel automagic moeten bijnummeren? kan je later die 0 kolom droppen.

Of zoals TeeDee aangeeft........ insert into andere tabel die wel auto_increment id veld heeft (velden) select records from andere tabel....
Hij nummert het jammer genoeg niet automatisch, dan laat die alles op 0 staan en de volgende record die je toevoegd wordt dan 1. Niet helemaal de bedoeling dus.

Manier van TeeDee is me nog niet helemaal gelukt, maar ik doe het nu maar met php dan moet het wel lukken.. ben ik sneller klaar dan waarmee ik nu bezig ben :)

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Xof schreef op 30 september 2004 @ 15:19:
[...]


Hij nummert het jammer genoeg niet automatisch, dan laat die alles op 0 staan en de volgende record die je toevoegd wordt dan 1. Niet helemaal de bedoeling dus.

Manier van TeeDee is me nog niet helemaal gelukt, maar ik doe het nu maar met php dan moet het wel lukken.. ben ik sneller klaar dan waarmee ik nu bezig ben :)
Wel als je auto_increment field een andere naam geeft als je huidige id field.
Daarna drop je de oude tabel en de oude id field in de nwe tabel
Daarna renamen van de tabel en de auto_increment field.

Programmer - an organism that turns coffee into software.


Verwijderd

Je kunt een query een rijnummer terug laten geven:
code:
1
2
3
4
SELECT col1, 
(SELECT COUNT(*) FROM myTable t2 WHERE t2.col1<= t.col1) AS rownumber
FROM myTable t
ORDER BY col1

Als je dit combineert met een UPDATE query ben je er, volgens mij.
Dit werkt overigens alleen als col1 unieke waarden bevat.

Trouwens, hier vind je het complete verhaal.

  • Xof
  • Registratie: Juni 2001
  • Laatst online: 22:41
ok thanks, maar het is me al gelukt met php :)
auto increment is handig, als het meewerkt ;)

Verwijderd

Even deze queries uitvoeren:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//maakt een tijdelijke kolom aan die auto_increment en primary key is
// Mogelijk moet je even de primary key van je eerste kolom verwijderen!!!
ALTER TABLE vervang_deze_door_tabelnaam ADD `temp_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY 

//Vervangt de waarde van de eerste kolom door de temp_id
UPDATE test SET vervang_deze_door_eerste_kolom_naam = temp_id

//de tijdelijke kolom wordt verwijderd
ALTER TABLE `test` DROP `temp_id` 

//de primary key wordt teruggezet / aangemaakt
ALTER TABLE `test` ADD PRIMARY KEY (vervang_deze_door_eerste_kolom_naam`) 

//auto increment wordt toegevoegd aan de eerste kolom
ALTER TABLE `test` CHANGE ` vervang_deze_door_eerste_kolom_naam` ` vervang_deze_door_eerste_kolom_naam` INT( 11 ) DEFAULT '0' NOT NULL AUTO_INCREMENT 


Succes ermee!

  • d00d
  • Registratie: September 2003
  • Laatst online: 16-09-2025

d00d

geen matches

curry684 schreef op 30 september 2004 @ 15:02:
[...]

Update is niet set-based :) Probeer jij die code van mij maar eens uit in SQL Server, werkt perfect: dat is juist een van de trucs waardoor je enorm remmende cursors kunt omzeilen.

Ook een leuke in dat gebied:
SQL:
1
2
declare @recipients varchar(4096);
select @recipients = @recipients + email + ';' from users;

Hier komt netjes een ;-separated string van alle mailadressen uit :)
En vandaar dat dus ook het volgende werkt en meteen de oplossing is voor het probleem:
SQL:
1
2
3
declare @i int
set @i = 0
update users set id = @i, @i = @i + 1

42.7 percent of all statistics are made up on the spot.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 17-12-2025

curry684

left part of the evil twins

d00d schreef op 01 oktober 2004 @ 12:28:
[...]


En vandaar dat dus ook het volgende werkt en meteen de oplossing is voor het probleem:
SQL:
1
2
3
declare @i int
set @i = 0
update users set id = @i, @i = @i + 1
Anders jat je m'n code even: [rml]curry684 in "[ SQL] Kolom met 0'en veranderen naar 1,2..."[/rml] 8)7

Je corrigeert wel een bugje trouwens, de ophoging gebeurt eerst dus die van mij ging vanaf 2 nummeren maar okee :)

Professionele website nodig?


  • d00d
  • Registratie: September 2003
  • Laatst online: 16-09-2025

d00d

geen matches

curry684 schreef op 01 oktober 2004 @ 14:41:
[...]

Anders jat je m'n code even: [rml]curry684 in "[ SQL] Kolom met 0'en veranderen naar 1,2..."[/rml] 8)7

Je corrigeert wel een bugje trouwens, de ophoging gebeurt eerst dus die van mij ging vanaf 2 nummeren maar okee :)
Je hebt helemaal gelijk... sorry Curry; jouw oplossing.
Ik wist trouwens niet dat dit kon, biedt wel veel nieuwe mogelijkheden.

42.7 percent of all statistics are made up on the spot.


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Heel SQL is set-based, en dan zou het update-statement dat niet zijn :?
Dat de operatie uiteindelijk elke row apart behandeld (dus bijv de update tabel set row = row +1) is weer wat anders.
Probeer jij die code van mij maar eens uit in SQL Server, werkt perfect: dat is juist een van de trucs waardoor je enorm remmende cursors kunt omzeilen.
Dat is dus hoe SQL Server werkt met variabelen, maar dat zegt nog niet dat alle SQL producten dat dan ook zo doen ;) In PostgreSQL heb ik zoiets als je select-voorbeeld wel eens opgelost met een eigen aggregate-functie. Toen wilde ik de boel ala ($row1, $row2, ...) eruit krijgen.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 17-12-2025

curry684

left part of the evil twins

ACM schreef op 01 oktober 2004 @ 15:31:
[...]

Heel SQL is set-based, en dan zou het update-statement dat niet zijn :?
Ik zei het fout :) Indien je misbruik maakt van assign-statements kun je de set-based aspecten van de taal misbruiken om row-based operaties uit te voeren. Zo dan? ;)
Dat is dus hoe SQL Server werkt met variabelen, maar dat zegt nog niet dat alle SQL producten dat dan ook zo doen ;)
Er stond ook "als je SQL Server hebt..." boven m'n post ;)
In PostgreSQL heb ik zoiets als je select-voorbeeld wel eens opgelost met een eigen aggregate-functie. Toen wilde ik de boel ala ($row1, $row2, ...) eruit krijgen.
Er zijn veel creatieve manieren om SQL te misbruiken voor row-based operaties zonder aan cursors te hoeven beginnen. Het voorbeeld met de update dat ik gaf komt overigens vrijwel linea recta uit "The Guru's Guide to Transact-SQL", lekker pijnlijk leesvoer, maar compatibiliteit is dan niet het eerste doel nee :P

Professionele website nodig?


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

curry684 schreef op 01 oktober 2004 @ 15:35:
Ik zei het fout :) Indien je misbruik maakt van assign-statements kun je de set-based aspecten van de taal misbruiken om row-based operaties uit te voeren. Zo dan? ;)
Goedzo :P
Er zijn veel creatieve manieren om SQL te misbruiken voor row-based operaties zonder aan cursors te hoeven beginnen. [...] maar compatibiliteit is dan niet het eerste doel nee :P
Compatibiliteit en performance bijten elkaar sowieso nogal vaak, dus zodra je zoiets probeert op een snelle manier in je DB op te lossen, dan ben je bijna altijd gedwongen daar een implementatie-specifieke manier voor te gebruiken.
Pagina: 1