[Gambas-user] [slightly OT] No Problem with Gambas or MySql!

Charlie Reinl Karl.Reinl at ...2345...
Sun Oct 6 11:55:27 CEST 2013


Am Sonntag, den 06.10.2013, 10:55 +1030 schrieb Bruce:
> On Sun, 2013-10-06 at 00:58 +0200, Willy Raets wrote:
> > On Sun, 2013-10-06 at 00:05 +0200, Caveat wrote:
> > > > If you wanted to delete one row with values 347 200, then which row would it be?
> > > 
> > > It *doesn't matter*!  The rows are the same, so pick a row, ANY row!
> > 
> > That is exactly what I have been doing for the last 10 years.
> > In VB code I just looked for the criteria in the table and deleted the
> > first record that met the criteria, next update table and ready.
> > 
> > In Gambas I tried the same, now with the table being in MySql, and it
> > didn't work.
> > 
> > It never, ever failed me in those 10 years, even without a primary key.
> > Although most other tables do have primary keys and relations set up,
> > there never was a need for this table to have a primary key.
> > And I still do not see the need for a primary key.
> > 
> > > 
> > > > Without the primary key, you're asking MySQL to guess, and it wont.
> > > 
> > > Yes it will, if you use LIMIT (see my previous two mails).  Otherwise, it'll happily delete all the rows that meet the criteria, whether they're duplicates or not.
> > > 
> > 
> > And even in MySql there is NO need for the table to have a primary key
> > as the 'SELECT ... limit 1' will do what I expect, delete only 1 record
> > that meets the criteria.
> > 
> > > > >"duplicate rows are and always were a mistake in SQL", C.J.Date
> > 
> > Duplicate rows are a reality in real life data gathering.
> > I have been working with databases since dbase somewhere in the '80's
> > and I have had to deal with real life situations concerning data
> > storage, not with theory for ideal models. Not saying I haven't read my
> > share on relational database design and take it into account when
> > designing a database.
> > 
> > > 
> > > The guy has obviously never read William Kent's "Data and Reality". It's 
> > > a book I'd still recommend to anyone working with data and particularly 
> > > databases, even though it was written 35 years ago!
> > > 
> > > <RANT>
> > > Why *must* every record be uniquely identifiable?  Explain why... don't 
> > > just throw random snippets of relational database theory at me!  If I 
> > > ask you to model the contents of your pockets on a database, are you 
> > > going to attach some artificial key to each individual penny?  Why?  
> > > They each buy the same number of penny chews (showing my age!), and if 
> > > you take 3 pennies away, you've still got 3 pennies less than you had 
> > > before, no matter how carefully you select those 3 pennies!
> > > </RANT>
> > > 
> > > <HINT>
> > > A tuple is, by definition, unique.  If I have 8 rows on my database 
> > > representing 8 real-world penny objects and I can delete 3 of them... 
> > > are the remaining 5 rows tuples?  How closely does the database model 
> > > reality in this case?
> > > </HINT>
> > 
> > I like your penny story ;)
> > 
> > 
> 
> [ASIDE!]
> 
> Interesting discussion, but someone recently asked me why I prefer
> postgresql over mysql and this thread reminded me that I never answered.
> 
> One of those reasons is that this whole situation cannot occur in
> postgresql.  It has been designed such that it cannot. Considering a
> non-normalised table, i.e. one that has no natural (unique) primary key,
> all rows are still capable of being operated on using the standard sql
> commands. However, in that case, *all* rows that succeed the WHERE
> filter clause will be acted on. Fullstop. 
> 
> Putting that another way, postgresql "doesn't really care" whether the
> table has a primary key set or not. Nor does it care whether a delete or
> an update query uses a unique row identifier.  That sounds pretty slack,
> doesn't it?  Well, not at all really.  It relies on the WHERE clause to
> identify the set of rows to be operated on and that is all.  If such a
> clause identifies multiple rows then they will all be affected. So, to
> continue the coin collection analogy and a theoretical sql command:
> SELL COIN WHERE YEAR="1930" AND ALLOY="Cupronickel";
> would sell all the coins that match.  The idea that you could write a
> command like:
> SELL THE FIRST COIN YOU FIND WHERE YEAR="1930" AND ALLOY="Cupronickel";
> really, to me brings a sense of randomness into the game ... ??? What is
> the dbms supposed to imagine "THE FIRST COIN YOU FIND" to mean?
> 
> Here in the thoroughbred racing industry, we have a somewhat similar
> real world situation.  All thoroughbreds have a registered name and
> there are strict controls over the reuse of a name.  However, horse
> owners are allowed to change the registered name of the horse
> occasionally and under certain conditions. All pretty good and you could
> imagine that the name "Lemon Liniment" would uniquely identify a
> specific horse from any of the other 61,000 we have on our database.
> Further you might imagine that if the owners changed its' name to
> "Cherry Zontop" then all we would have to do is, once the name change
> has been registered, change that "unique" primary key.  Hah ha!  No such
> simplicity exists on the planet.
> 
> First off, the horse is really and truly identified by its microchip ID.
> This is what the register uses as the unique identifier.  However, they
> don't publish that (and for good reasons if you think about it ...) and
> secondly name change events are frequently if not often publicised some
> time after the actual change has been registered.  This is a major,
> major problem, (to us, logistically not technically).
> 
> Suppose Jack (the owner of Lemon Liniment) sells it to Jill (on
> Wednesday) who re-registers it as Cherry Zontop.  Jill then races it
> once on the next Saturday and we see a race entrance and result appear
> in the official race records for Cherry Zontop.  We think that Cherry
> Zontop is a "new untried" horse and add it as a new horse in the
> database.  On the Monday (or later) the registry publicises the name
> change...
> 
> Under MySQL merging the histories of Lemon Liniment into Cherry Zontop
> was a technical nightmare that essentially required offloading and
> reloading multiple sets of rows from multiple tables*.  Under postgresql
> it is the execution of one SQL command:
> UPDATE horse SET name='Cherry Zontop', namechanged=TRUE, oldname='Lemon
> Liniment' WHERE name='Lemon Liniment';
> 
> * I have simplified the story a fair bit, there are around 18 underlying
> tables that have the horse name as the foreign key or as part of the
> foreign key. 
> 
> postgres, because it properly supports "ON UPDATE CASCADE" constraints
> on those tables and their foreign key columns handles it all internally.
> 
> Anyway, as I said, [ASIDE] and just one of the reasons for preferring
> postgresql.
> 
> regards
> Bruce

Salut Bruce,

how do you look back to 'Lemon Liniment' history ?


-- 
Amicalement
Charlie





More information about the User mailing list