Re: Incrementing a "Private" Integer Space

2007-11-25 Thread David T. Ashley
Hi Martin,

The easiest way to restore context in this conversation is to go to the
MySQL home page (www.mysql.com), then go to "Community", then "Lists", then
to look at the archives of the main MySQL mailing list (this one).

I believe at this point that Chris and Stut answered my question
decisively.  They both gave me single-query methods of achieving the
behavior that I want.

Thanks to all ...

Dave.

On 11/25/07, Martin Gainty <[EMAIL PROTECTED]> wrote:
>
>
> Dave is trying to establish an algorithm which would fit your requirement
> I can see column q is auto-increment which makes sense as you retain the
> capability to generate a unique row but jumping into the middle of a
> conversation without knowing the prior discussionWhat is/was/will be the
> purpose of column p..?Can we denormalise a bit and extrapolate the value of
> column p based on known value of column
> q?Martin-__Disclaimer and
> confidentiality noteEverything in this e-mail and any attachments relates to
> the official business of Sender. This transmission is of a confidential
> nature and Sender does not endorse distribution to any party other than
> intended recipient. Sender does not necessarily endorse content contained
> within this transmission.> > On 11/25/07, Chris W <[EMAIL PROTECTED]>
> wrote:> >> > Stut wrote:> > >> > > insert into test1 set p = 2, q = (select
> max(q) + 1 from test1 as tmp> > > where p = 2)> > >> > > Probably not very
> efficient, but it works.> > >> > > -Stut> > >> > Auto increment is much
> easier to do. If your primary key is made up of> > two fields and one of
> them is Auto Increment, then it will have the> > desired behavior, just do
> this experiment and see> >> > CREATE TABLE `t` (> > `p` int(10) unsigned
> NOT NULL default '0',> > `q` int(10) unsigned NOT NULL auto_increment,> >
> PRIMARY KEY (`p`,`q`)> > ) ;> >> > INSERT INTO `t` (`p`,`q`) VALUES> >
> (1,NULL),> > (1,NULL),> > (1,NULL),> > (2,NULL),> > (2,NULL),> > (2,NULL),>
> > (2,NULL),> > (2,NULL),> > (3,NULL),> > (3,NULL);> >> > --> > Chris W> >
> KE5GIX> > > Hi Chris,> > OK, I will try that. Thanks for the help.> > My
> assumption in reading your original post was that you didn't understand>
> what I wanted to do (but you did).> > In order for me to use the solution
> you have proposed, in addition to> working, this behavior would have to be
> described in the MySQL manual. The> reason is that this seems to be the kind
> of behavior that could change from> version to version.> >  POINT>> I don't suppose you know the section in the manual that defines the
> behavior> you're describing?> > > The issue is that
> unless this behavior is defined, changing autoincrement> from the behavior
> you described to a simpler version that just uses> ascending integers with
> no other context is the kind of thing where the guys> at MySQL might reason
> that it won't affect anyone or wasn't defined in a> specific way anyway.> >
> Strictly speaking, this feared change wouldn't affect the logical correct>
> operation of my database (there would still be key uniqueness), but the
> neat> n, n+1, n+2 ordering I'm looking for in "q" would confuse humans.> >
> Phrased more compactly: unless MySQL calls out this behavior in the>
> documentation, your solution scares the snot out of me.> > Thank you
> sincerely, Dave.
> _
> Put your friends on the big screen with Windows Vista(R) + Windows Live™.
>
> http://www.microsoft.com/windows/shop/specialoffers.mspx?ocid=TXT_TAGLM_CPC_MediaCtr_bigscreen_102007


RE: Incrementing a "Private" Integer Space

2007-11-25 Thread Martin Gainty

Dave is trying to establish an algorithm which would fit your requirement
I can see column q is auto-increment which makes sense as you retain the 
capability to generate a unique row but jumping into the middle of a 
conversation without knowing the prior discussionWhat is/was/will be the 
purpose of column p..?Can we denormalise a bit and extrapolate the value of 
column p based on known value of column 
q?Martin-__Disclaimer and 
confidentiality noteEverything in this e-mail and any attachments relates to 
the official business of Sender. This transmission is of a confidential nature 
and Sender does not endorse distribution to any party other than intended 
recipient. Sender does not necessarily endorse content contained within this 
transmission.> > On 11/25/07, Chris W <[EMAIL PROTECTED]> wrote:> >> > Stut 
wrote:> > >> > > insert into test1 set p = 2, q = (select max(q) + 1 from test1 
as tmp> > > where p = 2)> > >> > > Probably not very efficient, but it works.> 
> >> > > -Stut> > >> > Auto increment is much easier to do. If your primary key 
is made up of> > two fields and one of them is Auto Increment, then it will 
have the> > desired behavior, just do this experiment and see> >> > CREATE 
TABLE `t` (> > `p` int(10) unsigned NOT NULL default '0',> > `q` int(10) 
unsigned NOT NULL auto_increment,> > PRIMARY KEY (`p`,`q`)> > ) ;> >> > INSERT 
INTO `t` (`p`,`q`) VALUES> > (1,NULL),> > (1,NULL),> > (1,NULL),> > (2,NULL),> 
> (2,NULL),> > (2,NULL),> > (2,NULL),> > (2,NULL),> > (3,NULL),> > (3,NULL);> 
>> > --> > Chris W> > KE5GIX> > > Hi Chris,> > OK, I will try that. Thanks for 
the help.> > My assumption in reading your original post was that you didn't 
understand> what I wanted to do (but you did).> > In order for me to use the 
solution you have proposed, in addition to> working, this behavior would have 
to be described in the MySQL manual. The> reason is that this seems to be the 
kind of behavior that could change from> version to version.> > > I don't suppose you know the section in the manual that 
defines the behavior> you're describing?> > > The issue is 
that unless this behavior is defined, changing autoincrement> from the behavior 
you described to a simpler version that just uses> ascending integers with no 
other context is the kind of thing where the guys> at MySQL might reason that 
it won't affect anyone or wasn't defined in a> specific way anyway.> > Strictly 
speaking, this feared change wouldn't affect the logical correct> operation of 
my database (there would still be key uniqueness), but the neat> n, n+1, n+2 
ordering I'm looking for in "q" would confuse humans.> > Phrased more 
compactly: unless MySQL calls out this behavior in the> documentation, your 
solution scares the snot out of me.> > Thank you sincerely, Dave.
_
Put your friends on the big screen with Windows Vista® + Windows Live™.
http://www.microsoft.com/windows/shop/specialoffers.mspx?ocid=TXT_TAGLM_CPC_MediaCtr_bigscreen_102007

Re: Incrementing a "Private" Integer Space

2007-11-25 Thread Chris W



David T. Ashley wrote:

Hi Chris,

OK, I will try that.  Thanks for the help.

My assumption in reading your original post was that you didn't understand
what I wanted to do (but you did).

In order for me to use the solution you have proposed, in addition to
working, this behavior would have to be described in the MySQL manual.  The
reason is that this seems to be the kind of behavior that could change from
version to version.


I don't suppose you know the section in the manual that defines the behavior
you're describing?

  

From '3.6.9. Using AUTO_INCREMENT'

"For MyISAM and BDB tables you can specify AUTO_INCREMENT on a secondary 
column in a multiplecolumn
index. In this case, the generated value for the AUTO_INCREMENT column 
is calculated as
MAX(auto_increment_column) + 1 WHERE prefix=given-prefix. This is useful 
when

you want to put data into ordered groups."

I didn't know it only worked in MyISAM and BDB... I almost always use 
MyISAM anyway.  However I don't use that feature anymore due to my 
change in thinking on primary keys.   The only time I use a primary key 
that has more than one field is if the table is a "many to many 
relationship" table and in that case neither field is auto increment.




--
Chris W
KE5GIX

"Protect your digital freedom and privacy, eliminate DRM, 
learn more at http://www.defectivebydesign.org/what_is_drm";


Ham Radio Repeater Database.
http://hrrdb.com


--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:http://lists.mysql.com/[EMAIL PROTECTED]



Re: Incrementing a "Private" Integer Space

2007-11-25 Thread David T. Ashley
On 11/25/07, Chris W <[EMAIL PROTECTED]> wrote:
>
> Stut wrote:
> >
> > insert into test1 set p = 2, q = (select max(q) + 1 from test1 as tmp
> > where p = 2)
> >
> > Probably not very efficient, but it works.
> >
> > -Stut
> >
> Auto increment is much easier to do.  If your primary key is made up of
> two fields and one of them is Auto Increment, then it will have the
> desired behavior, just do this experiment and see
>
> CREATE TABLE  `t` (
> `p` int(10) unsigned NOT NULL default '0',
> `q` int(10) unsigned NOT NULL auto_increment,
> PRIMARY KEY  (`p`,`q`)
> ) ;
>
> INSERT INTO `t` (`p`,`q`) VALUES
> (1,NULL),
> (1,NULL),
> (1,NULL),
> (2,NULL),
> (2,NULL),
> (2,NULL),
> (2,NULL),
> (2,NULL),
> (3,NULL),
> (3,NULL);
>
> --
> Chris W
> KE5GIX


Hi Chris,

OK, I will try that.  Thanks for the help.

My assumption in reading your original post was that you didn't understand
what I wanted to do (but you did).

In order for me to use the solution you have proposed, in addition to
working, this behavior would have to be described in the MySQL manual.  The
reason is that this seems to be the kind of behavior that could change from
version to version.


I don't suppose you know the section in the manual that defines the behavior
you're describing?


The issue is that unless this behavior is defined, changing autoincrement
from the behavior you described to a simpler version that just uses
ascending integers with no other context is the kind of thing where the guys
at MySQL might reason that it won't affect anyone or wasn't defined in a
specific way anyway.

Strictly speaking, this feared change wouldn't affect the logical correct
operation of my database (there would still be key uniqueness), but the neat
n, n+1, n+2 ordering I'm looking for in "q" would confuse humans.

Phrased more compactly:  unless MySQL calls out this behavior in the
documentation, your solution scares the snot out of me.

Thank you sincerely, Dave.


Re: Incrementing a "Private" Integer Space

2007-11-25 Thread Chris W

Stut wrote:


insert into test1 set p = 2, q = (select max(q) + 1 from test1 as tmp 
where p = 2)


Probably not very efficient, but it works.

-Stut

Auto increment is much easier to do.  If your primary key is made up of 
two fields and one of them is Auto Increment, then it will have the 
desired behavior, just do this experiment and see


CREATE TABLE  `t` (
`p` int(10) unsigned NOT NULL default '0',
`q` int(10) unsigned NOT NULL auto_increment,
PRIMARY KEY  (`p`,`q`)
) ;

INSERT INTO `t` (`p`,`q`) VALUES
(1,NULL),
(1,NULL),
(1,NULL),
(2,NULL),
(2,NULL),
(2,NULL),
(2,NULL),
(2,NULL),
(3,NULL),
(3,NULL);

--
Chris W
KE5GIX

"Protect your digital freedom and privacy, eliminate DRM, 
learn more at http://www.defectivebydesign.org/what_is_drm";


Ham Radio Repeater Database.
http://hrrdb.com


--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:http://lists.mysql.com/[EMAIL PROTECTED]



Re: Incrementing a "Private" Integer Space

2007-11-25 Thread Stut

David T. Ashley wrote:

On 11/25/07, Stut <[EMAIL PROTECTED]> wrote:


David T. Ashley wrote:

I have a table with two integer fields (call them p and q).

When I insert a record with a known p, I want to choose q to be one

larger

than the largest q with that p.

What is the best and most efficient way to do this?

For example, let's say the table contains (p,q):

1,1
1,2
1,3
2,1
2,2
2,3
2.4
2,5
3,1
3,2

If I insert a new record with p=2, I would want to choose q to be

6.  But if

I insert a record with p=3, I would want to choose q to be 3.

Is there any alternative to locking the table, querying for max q with

the

desired p, then inserting?

insert into test1 set p = 2, q = (select max(q) + 1 from test1 as tmp
where p = 2)

Probably not very efficient, but it works.

-Stut

--
http://stut.net/




Thanks for the help, Stut.

Is there any way to modify the query so that it will also work on the first
insert where there are no records with the specified p?  (I.e. imagine in
the table below that I wanted to insert with p=25 ... and I'd want the query
to insert 25,1.)

Thanks, Dave.


You could probably do something using the if function. Untested but 
should work...


insert into test1 set p = 4, q = if((select count(1) from test1 as tmp1 
where p = 4) > 0, (select max(q) + 1 from test1 as tmp where p = 4), 1)


-Stut

--
http://stut.net/

--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:http://lists.mysql.com/[EMAIL PROTECTED]



Re: Incrementing a "Private" Integer Space

2007-11-25 Thread David T. Ashley
On 11/25/07, Stut <[EMAIL PROTECTED]> wrote:

> David T. Ashley wrote:
> > I have a table with two integer fields (call them p and q).
> >
> > When I insert a record with a known p, I want to choose q to be one
> larger
> > than the largest q with that p.
> >
> > What is the best and most efficient way to do this?
> >
> > For example, let's say the table contains (p,q):
> >
> > 1,1
> > 1,2
> > 1,3
> > 2,1
> > 2,2
> > 2,3
> > 2.4
> > 2,5
> > 3,1
> > 3,2
> >
> > If I insert a new record with p=2, I would want to choose q to be
> 6.  But if
> > I insert a record with p=3, I would want to choose q to be 3.
> >
> > Is there any alternative to locking the table, querying for max q with
> the
> > desired p, then inserting?
>
> insert into test1 set p = 2, q = (select max(q) + 1 from test1 as tmp
> where p = 2)
>
> Probably not very efficient, but it works.
>
> -Stut
>
> --
> http://stut.net/



Thanks for the help, Stut.

Is there any way to modify the query so that it will also work on the first
insert where there are no records with the specified p?  (I.e. imagine in
the table below that I wanted to insert with p=25 ... and I'd want the query
to insert 25,1.)

Thanks, Dave.


Re: Incrementing a "Private" Integer Space

2007-11-25 Thread Stut

David T. Ashley wrote:

I have a table with two integer fields (call them p and q).

When I insert a record with a known p, I want to choose q to be one larger
than the largest q with that p.

What is the best and most efficient way to do this?

For example, let's say the table contains (p,q):

1,1
1,2
1,3
2,1
2,2
2,3
2.4
2,5
3,1
3,2

If I insert a new record with p=2, I would want to choose q to be 6.  But if
I insert a record with p=3, I would want to choose q to be 3.

Is there any alternative to locking the table, querying for max q with the
desired p, then inserting?


insert into test1 set p = 2, q = (select max(q) + 1 from test1 as tmp 
where p = 2)


Probably not very efficient, but it works.

-Stut

--
http://stut.net/

--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:http://lists.mysql.com/[EMAIL PROTECTED]



Re: Incrementing a "Private" Integer Space

2007-11-24 Thread Chris W



David T. Ashley wrote:

I have a table with two integer fields (call them p and q).

When I insert a record with a known p, I want to choose q to be one larger
than the largest q with that p.

What is the best and most efficient way to do this?

For example, let's say the table contains (p,q):

1,1
1,2
1,3
2,1
2,2
2,3
2.4
2,5
3,1
3,2

If I insert a new record with p=2, I would want to choose q to be 6.  But if
I insert a record with p=3, I would want to choose q to be 3.

Is there any alternative to locking the table, querying for max q with the
desired p, then inserting?
  


Yes

CREATE TABLE  `t` (
 `p` int(10) unsigned NOT NULL default '0',
 `q` int(10) unsigned NOT NULL auto_increment,
 PRIMARY KEY  (`p`,`q`)
) ;

--
Chris W
KE5GIX

"Protect your digital freedom and privacy, eliminate DRM, 
learn more at http://www.defectivebydesign.org/what_is_drm";


Ham Radio Repeater Database.
http://hrrdb.com


--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:http://lists.mysql.com/[EMAIL PROTECTED]



Incrementing a "Private" Integer Space

2007-11-24 Thread David T. Ashley
I have a table with two integer fields (call them p and q).

When I insert a record with a known p, I want to choose q to be one larger
than the largest q with that p.

What is the best and most efficient way to do this?

For example, let's say the table contains (p,q):

1,1
1,2
1,3
2,1
2,2
2,3
2.4
2,5
3,1
3,2

If I insert a new record with p=2, I would want to choose q to be 6.  But if
I insert a record with p=3, I would want to choose q to be 3.

Is there any alternative to locking the table, querying for max q with the
desired p, then inserting?

Thanks.