On Tue, May 3, 2016 at 5:53 PM, Adrian Klaver <adrian.kla...@aklaver.com>
wrote:

> On 05/03/2016 02:27 PM, drum.lu...@gmail.com wrote:
>
>>
>>
>> On 4 May 2016 at 01:18, Melvin Davidson <melvin6...@gmail.com
>> <mailto:melvin6...@gmail.com>> wrote:
>>
>>
>>
>>     On Tue, May 3, 2016 at 1:21 AM, David G. Johnston
>>     <david.g.johns...@gmail.com <mailto:david.g.johns...@gmail.com>>
>> wrote:
>>
>>
>>             Well.. I don't need to add a constraint if I already have a
>>             default value, that's right...
>>
>>
>>         Wrong
>>         David J.
>>
>>
>>     What you need is a TRIGGER function & TRIGGER that will select  and
>>     assign the next users_code based on company_id.
>>     I'm not going to write the whole thing for you, but here is part of
>>     the trigger function logic.
>>
>>     eg: IF NEW.company_id = 1 THEN
>>                    NEW.users_code = NEXTVAL(c1_users_code_seq);
>>            ELSEIF NEW.company.id <http://NEW.company.id> = 2 THEN
>>                    NEW.users_code =  NEXTVAL(c2_users_code_seq);
>>            ELSEIF NEW.company.id <http://NEW.company.id> = 3 THEN
>>                    NEW.users_code =  NEXTVAL(c3_users_code_seq);
>>            ...
>>            ...
>>            ELSE
>>                <    something bad happened because NEW.company_id was
>>     not valid ?
>>            END IF;
>>
>>
>>
>>
>> Do I have to have one sequence peer company_id ? There will be
>> thousands.. isn't there a better way to do that?
>>
>
> A sequence just keeps on incrementing. If you want a gapless sequence for
> each company that each increment independently of each other then yes you
> will need a separate sequence for each.
>
> For an alternate strategy see this related thread:
>
>
> http://www.postgresql.org/message-id/2926b083-33c9-4648-8635-bc293c70e...@ravnalaska.net
>
> in particular this link from the thread:
>
> http://www.postgresql.org/message-id/44e376f6.7010...@seaworthysys.com
>
>
>
>>     Seriously, get yourself the books I have recommended and study them
>>     BEFORE you continue attempting to design your database.
>>     You need a firm understanding of logical design & flow, otherwise
>>     you will be wasting your time.
>>
>>
>> That's what I'm doing.. Studying.. asking for some help to get a better
>> understand.... isn't this the purpose of this mail list?
>>
>
>
> --
> Adrian Klaver
> adrian.kla...@aklaver.com
>



>Do I have to have one sequence peer company_id ? There will be thousands..
isn't there a better way to do that?

I agree that having thousands of sequences can be hard to manage,
especially in a function, but you did not state that fact before,
only that you wanted separate sequences for each company. That
being said, here is an alternate solution.

1. CREATE TABLE company_seqs
   (company_id bigint NOT NULL,
    last_seq   bigint NOT NULL,
    CONSTRAINT company_seqs_pk PRIMARY KEY (company_id)
   );

2. Every time you create a new company, you must insert the
   corresponding company_id  and last_seq [which will be 1}
into the company_seqs table.

3. Change the trigger function logic to something like below:

DECLARE
   v_seq_num INTEGER;

 BEGIN
   SELECT last_seq
   FROM company_seqs
   WHERE company_id = NEW.company_id INTO v_seq_num;
   UPDATE company_seqs
      SET last_seq  = last_seq + 1
    WHERE company_id = NEW.company_id;

   new.users_code = v_seq_num;


Now, just a quick comment. As has been said before, wanting a sequence with
no gaps for
each user in each company is a bit unrealistic and serves no purpose. For
example,
company_id 3 has 10 users, 1 > 10. What do you do when user 3 leaves and is
deleted?
As long as you have a unique user_code for each user, it does not matter.

>... Studying.. asking for some help to get a better understand.... isn't
this the purpose of this mail list?

Yes, but at the same time, it is evident that you are trying to design the
database before you have
a valid understanding of database design. To wit, you are putting the cart
before the horse.
While this list is here to help you, it is not meant as a DATABASE 101
course.

-- 
*Melvin Davidson*
I reserve the right to fantasize.  Whether or not you
wish to share my fantasy is entirely up to you.

Reply via email to