ugrás a tartalomhoz

Valami bajom van az auto_incrementtel

minarikede · 2007. Jún. 20. (Sze), 00.20
Sziasztok!

Tartok tőle, hogy valami nagyon egyszerű dolgot nem veszek észre. Nem rég keztem el sql-ezni, és már bajba is kerültem. Készítettem egy táblát a következő paranccsal phpMyAdminban:

CREATE TABLE `valami` (
`azon` INT( 9 ) NOT NULL AUTO_INCREMENT ,
`kat_nev` VARCHAR( 15 ) NOT NULL ,
`kat_leiras` TEXT NOT NULL ,
PRIMARY KEY ( `azon` )
) TYPE = innodb;

most pedig szeretnék egy új sort beszúrni a következő módon:

INSERT INTO `valami` (`kat_nev` , `kat_leiras` )
VALUES ('szoveg', 'szoveg') ;


De nem akar sikerülni, csak úgy ha az 'azon' mezőnek is adok egy értéket, holott én azt várnám, hogy automatikusan növekedjen. Vagy rosszul gondolom?

mit nem veszek észre?

A segítséget előre is köszönöm!
Cs.
 
1

doksi, példa

Táskai Zsolt · 2007. Jún. 20. (Sze), 00.57
ilyen kérdésekben remek útmutató a mysql reference, jelen esetben az INSERTre vonatkozó fejezet. itt ezt mondják:

If you do not specify a list of column names for INSERT ... VALUES or INSERT ... SELECT, values for every column in the table must be provided by the VALUES list or the SELECT statement. If you do not know the order of the columns in the table, use DESCRIBE tbl_name to find out.


amúgy te ezt módot használhatod (pár sorral lejjebbi példa)
INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);
esetedben
INSERT INTO valami (kat_nev,kat_leiras) VALUES('szoveg', 'szoveg');
2

köszönöm

minarikede · 2007. Jún. 20. (Sze), 07.21
köszi szépen a segítséget.

Olvastam a doksit, próbáltam e szerint eljárni, csakhogy a mezőket idézőjelbe tettem. hiba volt!

most már müxik!
3

Nem is biztos hogy hiba

kris7topher · 2007. Jún. 20. (Sze), 11.38
Nem biztos, hogy hiba, mert pl. a phpMyAdmin is idézőjelez, és mégis megy. Csak hogy míg a phpMy szerintem visszaidézőjelet (backtick) haszál, te aposztrófot.
4

Én így szoktam

Max Logan · 2007. Jún. 20. (Sze), 13.02
INSERT INTO valami VALUES(null, 'szoveg', 'szoveg');
5

null helyett tényleg semmi

gex · 2007. Jún. 20. (Sze), 13.08
null érték helyett lehet tényleg semmi az azonosító helyén:

INSERT INTO tabla VALUES (, 'szoveg', 'szoveg');
a null szerintem azért nem szerencsés, mert null értéke lehet egy mezőnek (persze nem az itt tárgyalt auto_incrementes azonosítónak).

egyébként más módon is ki lehet hagyni oszlopokat:

INSERT INTO tabla SET data1='szoveg', data2='szoveg';
6

ne már

Hodicska Gergely · 2007. Jún. 21. (Cs), 07.55
a null szerintem azért nem szerencsés, mert null értéke lehet egy mezőnek
Azért a NULL fogalmával illene tisztába kerülni, ha DB-vel foglalkozik az ember. A NULL, az nem egyenlő a "NULL" stringgel, és lehet, hogy éppen adott DB kezelő megengedi, hogy nem írsz oda semmit, de nem túl szerencsés már csak szemantikai szempontból sem, de hordozhatóság szempontjából se.


Üdv,
Felhő
8

hehe

gex · 2007. Jún. 22. (P), 22.48
Azért a NULL fogalmával illene tisztába kerülni, ha DB-vel foglalkozik az ember. A NULL, az nem egyenlő a "NULL" stringgel

tényleg? én nem is erre gondoltam, hanem arra az esetre, amikor egy mező nem NOT NULL, akkor a beírt null nem nem megadásnak vagy kihagyásnak (ezt most nem tudom jobban megfogalmazni) lesz értelmezve hanem NULL értéknek (ami ugyebár nem egy n-u-l-l karaktersorozat).
konkrétan arra az esetre próbáltam utalni, hogy van egy int mező, aminek alap értéke 0 de nincs megadva a NOT NULL tulajdonság, és amikor majd hasonló insertet ír valaki, akkor nem 0 fog megjelenni a rekordban, hanem NULL, amivel nem fog jól műkdni a select ... where akarmi != 0 kérés. legalábbis én már vártam a kvetkező ilyen témát, de lehet csak túl sok hülye kérdést olvasok mostanában itt.

szóval ezért írtam, hogy szvsz a null azért nem szerencsés, mert adott esetben értékként veheti fel egy mező.

egyébként én ezért is szeretem jobban az insert ... set ... formát (vagy akkor már legalább sorolja fel a mezőket is), mert ott nincsenek ilyen problémák. de azért szólj, ha valamit nem jól tudok.
9

nem értem

Hodicska Gergely · 2007. Jún. 23. (Szo), 11.14
Újra csak azt tudom mondani, hogy gondold át ezt a témakört. A NULL és a "NULL" nagyon nem ugyanaz, és soha sem lesz olyan, hogy ha egyiket írod be, akkor a másik lesz belőle. Ha egy mezőn nincs megadva a NOT NULL és nem adsz a konkrét mezőnek értéket, akkor teljesen oké, hogy NULL lesz az értéke. A default értékenk ott van szerepe, ahol megmondod, hogy NOT NULL, de nem adod meg az insertnél (és ez tök független attól, hogy a nem szabványos INSERT ... SET ... formát használod, vagy sem).

amivel nem fog jól műkdni a select ... where akarmi != 0 kérés
Na ez itt megint tipikusan a NULL érték rossz értelmezése. Nem is kell egy ilyen feltételnek kihozni a NULL értéket, arra az IS NULL, vagy IS NOT NULL formában tudsz szűrni.


Üdv,
Felhő
11

áhhh

gex · 2007. Jún. 23. (Szo), 12.47
A NULL és a "NULL" nagyon nem ugyanaz, és soha sem lesz olyan, hogy ha egyiket írod be, akkor a másik lesz belőle

ezt egyáltalán nem értem mire írod, ráadásul már másodszor.

újra leírom: én ezekkel tisztában vagyok, póbáltam egy kezdő fejével gondolkozni, és ezért írtam le, hogy az insert parancsban lévő null-t én azért tartom veszélyesnek, mert akár értékként is megjelenhet, ha nincs megadva a not null (és itt nem arra gondolok, hogy lesz egy "null" stringem, bár fogalmam sincs ezt honnan veszed, maga a NULL érték csak nem rossz kifejezés a NULL-ra). ehhez akkor még leírom azt is, hogy én nem használok null-t, azaz mindig megadom a not null-t a tábla definíciókban.

tehát van egy kezdő (egy kezdő!) programozónk, aki csinál egy hasonló táblát:

create table proba (
    szam int default 0,
    szoveg text
);
(szvsz előbb adnak meg default értéket, mint not null tulajdonságot)

nézzük sorban milyen módszereket ajánlottunk neki:

insert into proba (szoveg) values ('a');
kiváló, megjelenik a (0, 'a') sor a táblában.

insert into proba set szoveg = 'b';
még mindig szuper (0, 'b') az eredmény, bár - és ebben igazad van - nem szabványos.

insert into proba values (null, 'c');
(NULL, 'c') sor jelenik meg a táblában, ami később ősszezavarhatja a kezdő programozónkat (tehát még mindig nem engem), mert nem fog működni az oly jól kifundált select ... where szam != 0 kérése (igen, én tisztában vagyok mire való az is null és is not null).

insert into proba1 values (, 'd');
na ez meg égés, mert tényleg nem működik, és fogalmam sincs miért is volt ez a fejemben, lehet hogy valamikor régen még működött.

és akkor újra: próbáltam egy kezdő fejével gondolkozni, milyen hibák jöhetnek elő a tábla deklarálástól az első lekérdezésekig, és itt éreztem némi hibalehetőséget (mint ahogy a mysql-es srácok is) a NULL értékkel (avagy NULL-lal és még mindig nem "null" stringgel) kapcsolatban, kizárólag ezért írtam amit írtam.
13

irtam, hogy nem értem :)

Hodicska Gergely · 2007. Jún. 23. (Szo), 13.40
hogy az insert parancsban lévő null-t én azért tartom veszélyesnek, mert akár értékként is megjelenhet
Akkor soory, félre értettelek, csak elég érdekesn fogalmazol, mert a NULL az nagyjából (persze van még egyéb jelentés tartalma is) a nem megadást jelenti. Ez a fenti mondat is: mi az hogy veszélyes, egy NULL-t azért tesz az ember a query-be, mert NULL-t akar beszúrni az adott mezőbe. Kicsit olyan, mintha a default paramétert PHP-ban veszélyesnek tekintenénk, mert kezdők félreérthetik a használatát. Aki azért használ NULL-t egy NOT NULL-ként definiált mezőnél, hogy az megkapja a default értékét, hát az magára vessen, ez eszembe se jutna.


Üdv,
Felhő
14

egyetértünk

gex · 2007. Jún. 23. (Szo), 14.18
egy NULL-t azért tesz az ember a query-be, mert NULL-t akar beszúrni az adott mezőbe [...] Aki azért használ NULL-t egy NOT NULL-ként definiált mezőnél, hogy az megkapja a default értékét, hát az magára vessen

egyetértünk, ez a lényeg, Max Logan viszont nem null-t akart beszúrni. én csak erre akartam reflektálni, nem akartam, hogy ha később olvassák, félreérthető legyen, különben is ezt Tőled tanultam. ;P
tegnap este nagyon fáradt voltam, lehet ezért nem sikerült jól írnom, de legközelebb majd megpróbálok szabatosabban fogalmazni.
15

phpMyAdmin

Max Logan · 2007. Jún. 23. (Szo), 14.43
Megnéztem és a phpMyAdmin is NULL-t ír az auto_increment-es mezőhöz ...
10

NULL === nem megadás

Fraki · 2007. Jún. 23. (Szo), 12.21
akkor a beírt null nem nem megadásnak vagy kihagyásnak (ezt most nem tudom jobban megfogalmazni) lesz értelmezve hanem NULL értéknek


NULL === nem megadás, kihagyás. Nem tudsz olyan esetet mutatni, hogy egy mezőnek nincs "szabályos" értéke és NOT NULL. Most lehet játszani a szavakkal, úgy is mondhatjuk, hogy a NULL nem más, mint notáció az értéknélküliségre. Méghozzá ajánlott notáció, legalábbis az elhagyással szemben (, ...).
12

biztos a not null?

gex · 2007. Jún. 23. (Szo), 12.55
és NOT NULL

kíváncsi vagyok hány kezdőnél magától értetődő a not null használata.
7

később nehezebb visszakeresni

Marcell · 2007. Jún. 22. (P), 22.10
Ha így írod a kódot, később nem lesz egyértelmű az oszlopok sorrendje (persze a neve sem), és nehezebb lesz átírni a kódot.