equ Δημοσ. 19 Απριλίου 2006 Δημοσ. 19 Απριλίου 2006 Γεια σας παιδιά. Στο πλαίσιο της πτυχιακής μου έχω δημιουργήσει έναν πίνακα στον sql server ο οποίος έχει το ονοματεπώνυμο του πελάτη και θέλω να έχει και ένα Id για το κάθε πελάτη που να αυξάνεται κατά ένα (1,2,3,4,5,6) κτλ. Επειδή αυτό θα γίνεται μέσα από γλώσσα προγραμματισμού γνωρίζετε με ποια εντολή sql το id θα αυξάνεται αυτόματα όταν θα καταχωρώ έναν πελάτη (ή τουλάχιστον να έχω πρόσβαση πριν την καταχώρηση, στην τελευταία εγγραφή ώστε να βλέπω το id της προηγούμενης καταχώρησης);
bandito Δημοσ. 19 Απριλίου 2006 Δημοσ. 19 Απριλίου 2006 Γεια σας παιδιά. Στο πλαίσιο της πτυχιακής μου έχω δημιουργήσει έναν πίνακα στον sql server ο οποίος έχει το ονοματεπώνυμο του πελάτη και θέλω να έχει και ένα Id για το κάθε πελάτη που να αυξάνεται κατά ένα (1,2,3,4,5,6) κτλ. Επειδή αυτό θα γίνεται μέσα από γλώσσα προγραμματισμού γνωρίζετε με ποια εντολή sql το id θα αυξάνεται αυτόματα όταν θα καταχωρώ έναν πελάτη (ή τουλάχιστον να έχω πρόσβαση πριν την καταχώρηση, στην τελευταία εγγραφή ώστε να βλέπω το id της προηγούμενης καταχώρησης); δεν χρειάζεται να κάνεις κάτι στο query σου. Στον πίνακα που έχεις φτιάξει, βάλε το ID column να ειναι IDENTITY, με seed 1 , και step 1. Απο εκεί και πέρα το engine θα αναλάβει να τα αυξάνει για εσένα
equ Δημοσ. 19 Απριλίου 2006 Μέλος Δημοσ. 19 Απριλίου 2006 Φίλε μου μπορείς να μου πεις αναλυτικά πως συντάσσεται αυτή η εντολή sql? ας πουμε create table x (id.... και κάτι ακόμα... Πως μπορώ να πάω στην τελευταία εγγραφή του πίνακα; Αν θέλω να δω το τελευταίο id του τελευταίου πελάτη που καταχώρησα; Σε ευχαριστώ
bandito Δημοσ. 19 Απριλίου 2006 Δημοσ. 19 Απριλίου 2006 Φίλε μου μπορείς να μου πεις αναλυτικά πως συντάσσεται αυτή η εντολή sql? ας πουμε create table x (id.... και κάτι ακόμα... Πως μπορώ να πάω στην τελευταία εγγραφή του πίνακα; Αν θέλω να δω το τελευταίο id του τελευταίου πελάτη που καταχώρησα; Σε ευχαριστώ > CREATE TABLE MyTable ( id bigint IDENTITY(1,1) NOT NULL, .... .... ) Για το δευτερο: > SELECT SCOPE_IDENTITY() Btw, και το help του sql και το internet εχει πολύ πληροφορία για αυτά που ψάχνεις.
equ Δημοσ. 19 Απριλίου 2006 Μέλος Δημοσ. 19 Απριλίου 2006 Τελικά δε μου δέχεται ο mysql server την ιδιότητα identity. Δεν μπορώ να καταλάβω γιατι! Μπαίνω ως root αλλά και μου βγάζει συντακτικό σφάλμα. Το δοκίμασα στο mssql κι εκεί μου το δέχεται!! Δια του λόγου το αληθές create table pelates (id_pel int identity(1,1) NOT NULL, name char(30)); Τι λέτε;
bandito Δημοσ. 20 Απριλίου 2006 Δημοσ. 20 Απριλίου 2006 Τελικά δε μου δέχεται ο mysql server την ιδιότητα identity. Δεν μπορώ να καταλάβω γιατι! Μπαίνω ως root αλλά και μου βγάζει συντακτικό σφάλμα. Το δοκίμασα στο mssql κι εκεί μου το δέχεται!!Δια του λόγου το αληθές create table pelates (id_pel int identity(1' date='1) NOT NULL, name char(30)); Τι λέτε;[/quote'] Γιατι η mysql το έχει αλλιως CREATE TABLE `users` ( `id` bigint(20) NOT NULL auto_increment .... )
mkst Δημοσ. 20 Απριλίου 2006 Δημοσ. 20 Απριλίου 2006 Και για το άλλο ερώτημά σου: SELECT max(id) from users
equ Δημοσ. 20 Απριλίου 2006 Μέλος Δημοσ. 20 Απριλίου 2006 mkst το δεύτερο είναι σωστό. thanks Φίλε bandito δυστυχώς μου βγάζει συντακτικό σφάλμα Δοκίμασα και χωρίς ' ' αλλά τπτ
equ Δημοσ. 20 Απριλίου 2006 Μέλος Δημοσ. 20 Απριλίου 2006 Οκ το καταφερα! Ήθελε να είναι κλειδί η μεταβλητή για να δέχετε αυτόματη αρίθμηση.
bandito Δημοσ. 20 Απριλίου 2006 Δημοσ. 20 Απριλίου 2006 mkst το δεύτερο είναι σωστό. thanksΦίλε bandito δυστυχώς μου βγάζει συντακτικό σφάλμα Δοκίμασα και χωρίς ' ' αλλά τπτ προσοχή: αν γράφουν δυο η παραπάνω χρήστες το max(id) δεν είναι απαραίτητο οτι θα σου επιστρέψει το σωστο id.
mkst Δημοσ. 20 Απριλίου 2006 Δημοσ. 20 Απριλίου 2006 Τι ακριβώς εννοείς με το 'δύο ή παραπάνω χρήστες' ;
bandito Δημοσ. 21 Απριλίου 2006 Δημοσ. 21 Απριλίου 2006 Τι ακριβώς εννοείς με το 'δύο ή παραπάνω χρήστες' ; Π.χ Ας πούμε οτι έχουμε μια php σελιδα που κάνει δυο requests στην mysql. > insert into users ..... select max(id) from users Ας πούμε επίσης οτι δυο χρήστες που κάθονται μπροστά στο pc τους κάνουν εκείνη την ώρα register. Η σελιδα που ηρθε πρώτα σαν request εκτελεί το insert. Τα inserts που έχουν και indexes και σε περίπτωση που παίζουν και άλλα πράγματα εκείνη την στιγμή, μπορεί να καθυστερήσουν. Οποτε όση ώρα το ένα script περιμένει να τελειώσει το insert, το δευτερο script κοτσάρει το δικό του insert. Η βάση δηλαδη έχει δεχτεί τα εξής requests 1. [script 1] insert into (επιτυχής εισαγωγή με id = 6) 2. [script 2] insert into (επιτυχής εισαγωγή με id = 7) 3. [script 1] select max(id) (id = 7) 4. [script 2] select max(id) (id = 7). Το script 1 την έκατσε κοινώς. Το παραπάνω λάθος, αν και έχει μικρή πιθανότητα να συμβεί σε μικρά συστήματα με λίγους χρήστες, αν συμβεί μπορεί να δημιουργήσει χάος (φανταστείτε να χρεώνεται στον πελάτη Α τα items του πελάτη Β). Το σωστό λοιπόν ειναι >select mysql_insert_id() που σου επιστρέφει το τελευταίο id που έγινε απο το δικο σου client connection οπως εξηγεί και το manual της mysql
Sta Δημοσ. 21 Απριλίου 2006 Δημοσ. 21 Απριλίου 2006 Το σωστό λοιπόν ειναι >select mysql_insert_id() που σου επιστρέφει το τελευταίο id που έγινε απο το δικο σου client connection οπως εξηγεί και το manual της mysql Υπάρχει κάτι αντίστοιχο για την MS Access; Θέλω να αποφύγω race conditions κατά την εισαγωγή στη βάση.
bandito Δημοσ. 21 Απριλίου 2006 Δημοσ. 21 Απριλίου 2006 Υπάρχει κάτι αντίστοιχο για την MS Access; Θέλω να αποφύγω race conditions κατά την εισαγωγή στη βάση. Χμμμ, δεν έχω access εδώ και μια γρήγορη ματιά στον γοογλη δεν βρήκα αντίστοιχο του SCOPE_IDENTITY() για την access (πολύ πιθανό να υπάρχει όμως). Ένα κόλπο για να αποφεύγεις race conditions όταν δεν έχεις κατι ανάλογο του mysql_insert_id , είναι να κανεις το select max(id) με ενα where clause condition σε κάτι που ξέρεις οτι σίγουρα το έχεις βάλει εσύ (δεν είναι εντελώς fail safe, αλλά γενικά είναι πολύ ασφαλές). Π.χ αν έκανες ενα insert στον πίνακα users με το όνομα Mitsaklas και email [email protected]), τότε το select max(id) from users where username = 'Mitsaklas' and email = '[email protected]' θα σου φέρει το σωστό id ακόμα και αν εχει κανει insert παλιότερα ο ίδιος χρήστης, ή αν έπεσες σε race condition. Έχω την εντύπωση όμως οτι κάτι θα εχει και η MsAccess. Τσέκαρε το στο manual (ο γοογλης μου βγάζει ρώσικα sites ?!?!? )
Red_Phantom Δημοσ. 22 Απριλίου 2006 Δημοσ. 22 Απριλίου 2006 Χμμμ' date=' δεν έχω access εδώ και μια γρήγορη ματιά στον γοογλη δεν βρήκα αντίστοιχο του SCOPE_IDENTITY() για την access (πολύ πιθανό να υπάρχει όμως). Ένα κόλπο για να αποφεύγεις race conditions όταν δεν έχεις κατι ανάλογο του mysql_insert_id , είναι να κανεις το select max(id) με ενα where clause condition σε κάτι που ξέρεις οτι σίγουρα το έχεις βάλει εσύ (δεν είναι εντελώς fail safe, αλλά γενικά είναι πολύ ασφαλές). Π.χ αν έκανες ενα insert στον πίνακα users με το όνομα Mitsaklas και email [email'][email protected][/email]), τότε το select max(id) from users where username = 'Mitsaklas' and email = '[email protected]' θα σου φέρει το σωστό id ακόμα και αν εχει κανει insert παλιότερα ο ίδιος χρήστης, ή αν έπεσες σε race condition. Έχω την εντύπωση όμως οτι κάτι θα εχει και η MsAccess. Τσέκαρε το στο manual (ο γοογλης μου βγάζει ρώσικα sites ?!?!? ) SET ISOLATION LEVEL SERIALIZABLE READ WRITE και παίξε με TRANSACTIONS
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.