[Mysql] INT problemen

Pagina: 1
Acties:

  • GewoonNico
  • Registratie: April 2003
  • Laatst online: 21-08 20:44
Hallo,

Ik heb problemen met een mysql tabel.
Deze tabel ziet er als volgt uit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
  bargame_items (
  id int(255) NOT NULL auto_increment,
  id_group varchar(255) NOT NULL default '',
  name varchar(255) NOT NULL default '',
  description varchar(255) NOT NULL default '',
  costs decimal(10,0) NOT NULL default '0',
  max_num decimal(10,0) NOT NULL default '0',
  max_visitor decimal(10,0) NOT NULL default '0',
  level_power decimal(10,0) NOT NULL default '0',
  level_safety decimal(10,0) NOT NULL default '0',
  PRIMARY KEY  (id)
) TYPE=MyISAM;


In het veld ID staan 2 negatieve waardes en 115 Positieve. 'nul' komt er niet in voor.

Als ik nu een nieuwe rij toevoeg krijgt hij als id "2147483647" Terwijl dit 116 zou moeten zijn.
Als ik dan in phpmyadmin bij structuur ga kijken zie ik staan:

"Volgende Autoindex 2.147.483.647"

Wanneer ik kijk op http://www.mysql.com/doc/en/Column_types.html
Zie ik staan:

INT[(M)] [UNSIGNED] [ZEROFILL]
A normal-size integer. The signed range is -2147483648 to 2147483647. The unsigned range is 0 to 4294967295.

Mijne is Signed.

RaRa hoe kan het dat ik als id "2147483647" heb staan in plaats van 116 ?

  • GewoonNico
  • Registratie: April 2003
  • Laatst online: 21-08 20:44
Ik heb trouwens geprobeerd om '0 (nul)' toe te voegen, maar dit werkt niet.
Ook heb ik geprobeerd om de rij UNSIGNED te maken, ook dit werkt niet.

  • Tux
  • Registratie: Augustus 2001
  • Laatst online: 21-08 06:33

Tux

Ik weet niet of int() wel tot 255 lang gaat. Misschien moet je een bigint gebruiken ofzo

id int(255) signed NOT NULL auto_increment,

moet je in de CREATE query meuken.

The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.


  • Suepahfly
  • Registratie: Juni 2001
  • Laatst online: 13-08 14:09
Misshien heb je een bug gevonden :? in dat geval ff melden op mysql.com

Welke versie van mysql draai je (alfa of beta zitten vaak vol met bugs)
maak van id eens een ``signed'' (ik zou niet weten waaom je negative waarden een ID wilt opslaan)

  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Hoe voeg je je rijen toe?

Waarom ben je zo zeker dat het 116 moet zijn? Het is niet omdat het record met het hoogste ID 115 heeft, dat het volgende dan maar zeker 116 wordt.
Een ID wordt slechts 1x toegekend.
Stel, je hebt 100 records in je tabel, met ID 1 tot en met 100. Als je dan de laatste 50 records verwijderd, dan heb je nog records in je tabel met ID van 1 tot 50.
Als je dan een nieuw record toevoegt, dan krijg je geen record met ID 51, maar een record met ID 101.

Het is natuurlijk wel vreemd dat je volgende auto-incr. id op 2.147.483.647 staat, want ik kan moeilijk geloven dat je al zoveel records aan je tabel hebt toegevoegd.
Misschien is er iets corrupt ofzo in je DB.

Als de gegevens in je DB slechts testgegevens zijn, dan kan je misschien eens kijken of MySQL een statement heeft zoals TRUNCATE TABLE. MSSQL heeft dat, en met dat statement wordt de tabel volledig leeggemaakt, en worden de auto-incr fields ook gereset.

https://fgheysels.github.io/


  • GewoonNico
  • Registratie: April 2003
  • Laatst online: 21-08 20:44
Resetten heb ik ook al geprobeerd

Versies
phpMyAdmin 2.4.0-rc2
MySQL 3.23.56

ID is al Signed, en als ik dit UNsigned maak, verandert er niks.

Ik moet negatieve Id's opslaan zodat ik herken welke item's niet gekocht, kunnen worden (ik ben bezig met een game).


Item's toevoegen doe ik via een formuliertje:

PHP:
1
2
3
<?
mysql_query("INSERT INTO bargame_items (id_group,name,description,costs,max_num,max_visitor,level_power,level_safety) VALUES ('$_POST[group]','$_POST[name]','$_POST[description]','$_POST[costs]','$_POST[max_num]','$_POST[max_visitor]','$_POST[level_power]','$_POST[level_safety]')") or die(mysql_error());   
?>


Als ik de 1e keer een item toevoeg, krijgt deze bovengenoemde ID,
De 2e keer dat ik iets toevoeg wilt Mysql dit item hetzelfde ID geven, dus dan krijg ik een mysql error en daarin staat dat de Id al bestaat.

  • slm
  • Registratie: Januari 2003
  • Laatst online: 25-06 12:45

slm

Wat is dit nu weer voor ongein? Wie gaat er nou negatieve id-nummers gebruiken ? Dat is volgens mij vragen om problemen...

Anyway, je moet je id op INT(11) SIGNED zetten, maar dan is het nog steeds de vraag of het werkt...

INT(255)?? Hoe kom je daarbij?
Ik moet negatieve Id's opslaan zodat ik herken welke item's niet gekocht, kunnen worden (ik ben bezig met een game).
Zou je daar niet een ander veldje voor gebruiken? Lijkt me een stuk handiger.


edit/
Bij grotere ints --> BIGINT !

[ Voor 14% gewijzigd door slm op 07-09-2003 23:11 ]

To study and not think is a waste. To think and not study is dangerous.


  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 07-07 11:51
Uit de manual:
Inserting a negative number is regarded as inserting a very large positive number.
Je kan in MySQL de waarde van auto_increment veranderen: zie deze pagina uit de manual, vooral ook het commentaar.

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 21-02 23:50
het idee achter auto-incrementing IDs is dat je ervanaf blijft zelf. Dus niet de IDs gaat modden...

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • GewoonNico
  • Registratie: April 2003
  • Laatst online: 21-08 20:44
Dit wilt allemaal niet lukken.

Ik heb de auto increment ervanaf gehaald, en dit heb ik op de volgende manier opgelost:

PHP:
1
2
3
4
5
6
7
<?
$itemidq = mysql_fetch_object(mysql_query("SELECT id FROM bargame_items ORDER BY `id` DESC LIMIT 0,1"));    // Het laatste itemId zoeken
$itemid = $itemidq->id + 1;

mysql_query("INSERT INTO bargame_items (id,id_group,name,description,costs,max_num,max_visitor,level_power,level_safety) VALUES ('$itemid','$_POST[group]','$_POST[name]','$_POST[description]','$_POST[costs]','$_POST[max_num]','$_POST[max_visitor]','$_POST[level_power]','$_POST[level_safety]')") or die(mysql_error());  

?>

[ Voor 27% gewijzigd door GewoonNico op 08-09-2003 08:35 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Op die manier loop je binnen de kortste keren het risico dat je op concurrency problemen gaat stuiten.

https://fgheysels.github.io/


  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 19-08 19:06
whoami schreef op 08 September 2003 @ 09:05:
Op die manier loop je binnen de kortste keren het risico dat je op concurrency problemen gaat stuiten.
Behalve als je het op deze manier aanpakt (fouten voorbehouden):
SQL:
1
INSERT INTO tabel (id, veld2, veld3) SELECT MAX(id), "bladiebla", 15.40 FROM tabel;


Maar mooi is natuurlijk anders...

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

MySQL garandeert zelfs dan geen goede werking, maar MAX(id)+1 werkt sowieso beter.

't Probleem is dat de tabel ge-write-locked wordt op het moment dat je de select doet, dus de insert kan niet plaatsvinden, maar eventuele andere selects wel.

Met als gevolg dat er twee selects dezelfde max(id) kunnen vinden.
Als je de boel netjes locked en weer unlocked als je klaar bent voorkom je dat, maar of het ook echt nodig is? (bij een duplicaat kan je altijd nog de select/insert nog es uitvoeren en kijken of het dan wel lukt).
Pagina: 1