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

MySQL και διπλοεγγραφές...


CyberDreamer

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

Δημοσ.

Γεια σας,

 

στη μετακίνηση ενός site φωτογραφίας αποφάσισα να του αλλάξω και τρόπο που θα δουλεύει η βάση... η βάση του ήταν ms access και δούλευε μέσω dsn .. τα κατάφερα με τα κόπων και βάσανων να την κάνω MySQL (5.1) και με ODBC 3.51 (στην καλύτερη να συνδέομαι μέσω της classic ASP)....

 

Το πρόβλημα μου είναι με τις διπλοεγγραφές... στην access όριζες ανα πεδίο να μη δέχεται διπλότυπες εγγραφές... στην MYSQL που θα το κάνω αυτό...;;;; εδώ μέχρι και τα primaries keys δέχονται διπλοεγγράφες (i m gonna crazy!)...

 

κάνω κάτι λάθος ... θέλει κάτι να ορίσω στο my.ini... ή να σταματήσω να ασχολούμε με MySQL...

 

για το recordcount έφτυσα αίμα! αλλα το βρήκα... (cursorlocation=3 - για όσους δεν το βρήκαν ακόμη και μετα όλα τα recordcount δουλεύουν κανονικα...)

 

Ευχαριστώ προκαταβολικά...:o

 

---------- Το μήνυμα προστέθηκε στις 13:37 ----------

 

υπόψη, παιδιά δεν θέλω να το κάνω με κώδικα... αλλά να ορίζω μόνο τα πεδία που δεν θα δέχονται διπλότυπες εγγραφές...

Δημοσ.
Γεια σας,

 

στη μετακίνηση ενός site φωτογραφίας αποφάσισα να του αλλάξω και τρόπο που θα δουλεύει η βάση... η βάση του ήταν ms access και δούλευε μέσω dsn .. τα κατάφερα με τα κόπων και βάσανων να την κάνω MySQL (5.1) και με ODBC 3.51 (στην καλύτερη να συνδέομαι μέσω της classic ASP)....

 

Το πρόβλημα μου είναι με τις διπλοεγγραφές... στην access όριζες ανα πεδίο να μη δέχεται διπλότυπες εγγραφές... στην MYSQL που θα το κάνω αυτό...;;;; εδώ μέχρι και τα primaries keys δέχονται διπλοεγγράφες (i m gonna crazy!)...

 

κάνω κάτι λάθος ... θέλει κάτι να ορίσω στο my.ini... ή να σταματήσω να ασχολούμε με MySQL...

 

για το recordcount έφτυσα αίμα! αλλα το βρήκα... (cursorlocation=3 - για όσους δεν το βρήκαν ακόμη και μετα όλα τα recordcount δουλεύουν κανονικα...)

 

Ευχαριστώ προκαταβολικά...:o

 

---------- Το μήνυμα προστέθηκε στις 13:37 ----------

 

υπόψη, παιδιά δεν θέλω να το κάνω με κώδικα... αλλά να ορίζω μόνο τα πεδία που δεν θα δέχονται διπλότυπες εγγραφές...

 

Τσέκαρε μήπως έχεις ορίσει σύνθετο κλειδί και έτσι θεωρεί οτι ενα record είναι διπλότυπο μόνο αν όλα τα κλειδιά έχουν την ίδια τιμή

Δημοσ.

σύνθετο κλειδί ;;

 

sorry δεν σε πιάνω... στα αγγλικά δηλαδή;;; Btree ... πες μου ένα παράδειγμα...

 

---------- Το μήνυμα προστέθηκε στις 14:37 ----------

 

η να σου κάνω εγώ ένα:

 

example:

 

num name

1 giorgos p.

2 giorgos p.

 

exw primary mono to name kai to pernei kanonika...

Δημοσ.

Δηλαδή να εχεις primary δυο κλειδια καπως ετσι.

Παντως κατι πρεπει να κανεις λαθος για να τα παιρνει 2 φορες το ιδιο...

Στειλε μας το create του table

Δημοσ.

Μαλλον δεν εχεις primary το Γιώργος.

Κανονικά το νούμερο πρεπει να εχεις ως primary πάντα.

Για πολλους λογους..Ισως πρεπει να διαβασεις θεωρία βασεων δεδομένων

Δημοσ.
Δηλαδή να εχεις primary δυο κλειδια καπως ετσι.

Παντως κατι πρεπει να κανεις λαθος για να τα παιρνει 2 φορες το ιδιο...

Στειλε μας το create του table

 

Εσυ πώς ορίζεις στην Mysql να μην πέρνει διπλοεγγραφές σε 2-3 πεδία που είναι σημαντικά. π.χ λέμε ΑΦΜ, ταυτότητα... με primary ή υπάρχει άλλος τρόπος...;;; (δεν θέλω όμως κώδικα...)

 

 

create:

>
DROP TABLE IF EXISTS `photosar`.`categories`;
CREATE TABLE  `photosar`.`categories` (
 `ar` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `belong` int(10) unsigned DEFAULT '0',
 `catname` varchar(45) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
 PRIMARY KEY (`ar`,`catname`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=greek;

 

υπόψη δεν την έκανα την βάση με create κτλπ με sql line αλλα μέσα από MYSQL Administrator/etc...

 

---------- Το μήνυμα προστέθηκε στις 14:47 ----------

 

@Πάρης...

 

Πάρη με αυτό που λές δεν με βοηθάς....

εγώ θέλω απλώς να μου πείς τι να ορίσω στο MySQL administrator στο name (για το παράδειγμα) για να μη παίρνει δέυτερη εγγραφή...

 

(από βάσεις και προγραμματισμό γνωρίζω αρκετά) ..το movement από SQL και ACCESS σε MYSQL με χαλάει...

 

στη βάση που σου στέλνω έχω και το ar και το catname primary (BTREE) αλλά πάλι στο catname δέχεται διπλοεγγραφές... για πές μου λοιπόν τι να κάνω;;;

Δημοσ.

Εχεις βάλει για Primary Key Τον Αριθμό σε συνδιασμό με το text. Ο αριθμός είναι Autoincrement αρα ποτέ δεν θα αποκτήσεις διπλότυπο. αφου 1. text είναι διαφορετικός από τον 2. text

Δημοσ.

Aπο οσο εχω ψαξει η Mysql εχει λιγοτερες λειτουργίες απο MSSQL.

Επρεπε να ορίσεις το name σκέτο εαν θες να μην υπάρχει δυο φορές.

Κανονικά για αυτο που θες να μην παίρνει ενα ονομα δυο φορές (αν και αν μιλάνε για ονοματα ανθρώπων τοτε δεν πρεπει να ισχυει αυτο για λογους συνωνυμίας)..

Τωρα για αριθμό ταυτότητας κτλ η εστω πχ email να μην υπάρχει δευτερη φορά δεν ξέρω πως γίνεται καθαρά με τρόπο mysql και δεν ξέρω εαν γίνεται.Το μονο που μπορει να ελεγχει η mysql ειναι το primary key να μην ειναι ιδιο.

Τωρα εαν εχεις primary key συνθετο (id,name) τοτε θα μπορει να μπει πρακτικά πολλες φορες το ιδιο name και το ιδιο id..

 

O μονος τροπος για μένα και ο ποιο σωστός ειναι να κάνεις ελεγχο απο τον κώδικα σου.Για να ξέρεις τι συμβαίνει.Αλλιως δε θα ξερεις τι πήγε στραβά(διπλό όνομα; διπλο μαιλ;διπλη ταυτοτητα;)..

Απλα μπορεις ολα αυτα να τα ελεγξεις με κωδικα πολυ απλα....

Select count(*) from categories where tautotita=tade OR name=tade;

Εαν πάρεις πάνω απο 0 τοτε υπάρχει ηδη κάτι.. Κώδικας το πολυ 10 γραμμών για ολα...

Για πιο λογο δεν θες κωδικα;

Δημοσ.

Γιατί φαντάσου το σενάριο,

 

να έχεις αποθηκεύσει μια εγγραφή (για το π.χ.) ... και θέλεις να διορθώσεις την εγγραφή - η "ταυτότητα" να πρέπει να παραμένει ίδια - θα πρέπει να γράψω διαφορετικό κομμάτι κώδικα για τον έλεγχο και εδώ (στην διόρθωση, όχι μόνο στην νέα εγγραφή) και φαντάσου τώρα να έχει καμιά 30αριά πίνακες η βάση!!!

 

Για την αποθήκευση διορθωμένης εγγραφής με έλεγχο διπλτότυπων τι προτείνεις;

 

---------- Το μήνυμα προστέθηκε στις 18:29 ----------

 

Αφήστε το παιδιά...

 

το βρήκα...

 

είναι απλο....

 

>
DROP TABLE IF EXISTS `photosar`.`categories`;
CREATE TABLE  `photosar`.`categories` (
 `ar` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `belong` int(10) unsigned DEFAULT '0',
 `catname` varchar(45) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
 PRIMARY KEY (`ar`),
 UNIQUE KEY `Index_2` (`catname`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=greek;

 

στο παραπάνω παράδειγμα το catname θα μείνει μοναδικό - και ο τρόπος είναι το UNIQUE KEY !!!!

 

:-)

 

όποιος ψάχνει μαθαίνει... :-)

Δημοσ.
...Το μονο που μπορει να ελεγχει η mysql ειναι το primary key να μην ειναι ιδιο.

 

Αν είναι δυνατόν! Δεν υπάρχει dbms - sql ή μη - που να μην υποστηρίζει unique keys.

 

Οι διαφορές του primary με του unique είναι:

 

α) το primary δεν επιτρέπει nulls (το unique μπορεί *αν* θέλεις)

B) το primary χαρακτηρίζει το row και χρησιμοποιείται για referential integrity, constraints και foreign keys (το unique χαρακτηρίζει column)

c) επιτρέπεται 1 primary ανά table (unique όσα θέλουμε)

 

@CyberDreamer: Το "unique" είναι αυτό που ψάχνεις.

 

Ισως πρεπει να διαβασεις θεωρία βασεων δεδομένων

 

...

Δημοσ.

Δεν καταλαβαίνω που θα ειναι το προβλημα θα μπορουσες να ειχες μια συνάρτηση να ελεγχει τη μοναδικότητα για καποια collumns.

Εαν ισχύει το UNIQUE key για πολλα collumns τοτε θα εισαι μια χαρα με αυτη τη μεθοδο

Δημοσ.

ε ναι ΠαρηΓ αυτό λέμε... μόλις το είδα ότι δουλεύει και με unique key η mysql...

 

Thanx again..

 

---------- Το μήνυμα προστέθηκε στις 20:41 ----------

 

Αν είναι δυνατόν! Δεν υπάρχει dbms - sql ή μη - που να μην υποστηρίζει unique keys.

 

Οι διαφορές του primary με του unique είναι:

 

α) το primary δεν επιτρέπει nulls (το unique μπορεί *αν* θέλεις)

B) το primary χαρακτηρίζει το row και χρησιμοποιείται για referential integrity, constraints και foreign keys (το unique χαρακτηρίζει column)

c) επιτρέπεται 1 primary ανά table (unique όσα θέλουμε)

 

@CyberDreamer: Το "unique" είναι αυτό που ψάχνεις.

 

 

 

...

 

+++++++++ thanx anyway

Δημοσ.
Δεν καταλαβαίνω που θα ειναι το προβλημα θα μπορουσες να ειχες μια συνάρτηση να ελεγχει τη μοναδικότητα για καποια collumns.

 

Αυτό είναι μέγα σφάλμα, αγαπητέ, θεωρητικά και πρακτικά. Είναι τόσοι πολλοί οι λόγοι, κατά αυτής της λύσης, που πρέπει να γράψω πολλά για να σου εξηγήσω. Θα αρκεστώ σε ένα απλό παράδειγμα, ίσα για να σου δείξω "που είναι το πρόβλημα".

 

Φαντάσου data entry από 10άδες χρήστες σε έναν πίνακα μεγέθους GB στον οποίον εφαρμόζεις αυτή τη λύση. Κάθε φορά που κάνει κάποιος ένα insert, αναγκάζεις τη βάση σε full table scan. Αυτή η διαδικασία - ανάλογα τα μεγέθη και το server - μπορεί να διαρκέσει πολλά δεύτερα έως και λεπτά. Για κάθε insert!

 

Αντιθέτως, με ένα unique index, η βάση διατηρεί το κλειδί στη μνήμη ή εφαρμόζει efficient memory mapping σε μια δομή που της επιτρέπει binary search με αποτέλεσμα να έχει την απάντηση σε ms, ανεξάρτητα από το load και το μέγεθος του πίνακα.

 

Είναι προφανές πως εάν ο προγραμματιστής κάνει αυτό το λάθος σε ένα πεδίο, θα έχει κάνει παρόμοια πολλαπλά λάθη σε επίπεδο βάσης. Με αποτέλεσμα μια αναιμική εφαρμογή με τρομερούς περιορισμούς σε επίπεδο scaling.

 

Σου συνιστώ - φιλικά πάντα - να περιορίζεις το business logic σε πράγματα που δεν μπορεί να κάνει το data layer και να αφήνεις τη βάση να κάνει αυτά για τα οποία είναι φτιαγμένη.

Δημοσ.

Αγαπητέ Formaz εαν εχεις καμποσα πεδία unique υπάρχει κατατοπιστικό ερρορ να σου λεει που ειναι το προβλημα;

Σε ευχαριστώ για τις υποδείξεις και εγώ ετσι πιστευω πλεον και πιστευα αλλα επηρεάστηκα απο κατι καθηγητές που λεγαν το αντιθετο.

Ποιο ασχετοι απο αυτους δεν υπάρχουν τελικά

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

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

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