Προς το περιεχόμενο

sql identity - autoincrement (ήταν: sql)


equ

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια σας παιδιά. Στο πλαίσιο της πτυχιακής μου έχω δημιουργήσει έναν πίνακα στον sql server ο οποίος έχει το ονοματεπώνυμο του πελάτη και θέλω να έχει και ένα Id για το κάθε πελάτη που να αυξάνεται κατά ένα (1,2,3,4,5,6) κτλ. Επειδή αυτό θα γίνεται μέσα από γλώσσα προγραμματισμού γνωρίζετε με ποια εντολή sql το id θα αυξάνεται αυτόματα όταν θα καταχωρώ έναν πελάτη (ή τουλάχιστον να έχω πρόσβαση πριν την καταχώρηση, στην τελευταία εγγραφή ώστε να βλέπω το id της προηγούμενης καταχώρησης);

Δημοσ.
Γεια σας παιδιά. Στο πλαίσιο της πτυχιακής μου έχω δημιουργήσει έναν πίνακα στον sql server ο οποίος έχει το ονοματεπώνυμο του πελάτη και θέλω να έχει και ένα Id για το κάθε πελάτη που να αυξάνεται κατά ένα (1,2,3,4,5,6) κτλ. Επειδή αυτό θα γίνεται μέσα από γλώσσα προγραμματισμού γνωρίζετε με ποια εντολή sql το id θα αυξάνεται αυτόματα όταν θα καταχωρώ έναν πελάτη (ή τουλάχιστον να έχω πρόσβαση πριν την καταχώρηση, στην τελευταία εγγραφή ώστε να βλέπω το id της προηγούμενης καταχώρησης);

 

δεν χρειάζεται να κάνεις κάτι στο query σου. Στον πίνακα που έχεις φτιάξει, βάλε το ID column να ειναι IDENTITY, με seed 1 , και step 1. Απο εκεί και πέρα το engine θα αναλάβει να τα αυξάνει για εσένα :)

Δημοσ.

Φίλε μου μπορείς να μου πεις αναλυτικά πως συντάσσεται αυτή η εντολή sql?

 

ας πουμε create table x (id....

 

και κάτι ακόμα...

Πως μπορώ να πάω στην τελευταία εγγραφή του πίνακα; Αν θέλω να δω το τελευταίο id του τελευταίου πελάτη που καταχώρησα;

Σε ευχαριστώ

Δημοσ.
Φίλε μου μπορείς να μου πεις αναλυτικά πως συντάσσεται αυτή η εντολή sql?

 

ας πουμε create table x (id....

 

και κάτι ακόμα...

Πως μπορώ να πάω στην τελευταία εγγραφή του πίνακα; Αν θέλω να δω το τελευταίο id του τελευταίου πελάτη που καταχώρησα;

Σε ευχαριστώ

 

>
CREATE TABLE MyTable (
id bigint IDENTITY(1,1) NOT NULL,
....
       ....
)

 

Για το δευτερο:

 

>
SELECT SCOPE_IDENTITY()

 

Btw, και το help του sql και το internet εχει πολύ πληροφορία για αυτά που ψάχνεις.

Δημοσ.

Τελικά δε μου δέχεται ο mysql server την ιδιότητα identity. Δεν μπορώ να καταλάβω γιατι! Μπαίνω ως root αλλά και μου βγάζει συντακτικό σφάλμα. Το δοκίμασα στο mssql κι εκεί μου το δέχεται!!

Δια του λόγου το αληθές

create table pelates (id_pel int identity(1,1) NOT NULL, name char(30));

 

Τι λέτε;

Δημοσ.
Τελικά δε μου δέχεται ο 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 το δεύτερο είναι σωστό. thanks

Φίλε bandito δυστυχώς μου βγάζει συντακτικό σφάλμα :(

Δοκίμασα και χωρίς ' ' αλλά τπτ

Δημοσ.

Οκ το καταφερα! Ήθελε να είναι κλειδί η μεταβλητή για να δέχετε αυτόματη αρίθμηση.

Δημοσ.
mkst το δεύτερο είναι σωστό. thanks

Φίλε bandito δυστυχώς μου βγάζει συντακτικό σφάλμα :(

Δοκίμασα και χωρίς ' ' αλλά τπτ

 

προσοχή: αν γράφουν δυο η παραπάνω χρήστες το max(id) δεν είναι απαραίτητο οτι θα σου επιστρέψει το σωστο id.

Δημοσ.
Τι ακριβώς εννοείς με το 'δύο ή παραπάνω χρήστες' ;

 

Π.χ

Ας πούμε οτι έχουμε μια 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

Δημοσ.

Το σωστό λοιπόν ειναι

>select mysql_insert_id()

που σου επιστρέφει το τελευταίο id που έγινε απο το δικο σου client connection οπως εξηγεί και το manual της mysql

 

Υπάρχει κάτι αντίστοιχο για την MS Access; Θέλω να αποφύγω race conditions κατά την εισαγωγή στη βάση.

Δημοσ.
Υπάρχει κάτι αντίστοιχο για την 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 ?!?!? )

Δημοσ.
Χμμμ' 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

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...