Not sure if 'relinquish' is the right word since the foreign constraint is
going to be enforced if you enter a value for the PO. (May be my statement
was a little confusing).
Please see the example:
Create Table t1(a int primary key)
Create table t2 (b int primary key, ba null references t1(a))
I just wanted to make sure of this point.
Sundar
=========================================================
On Friday, April 20, 2012 6:03:47 PM UTC+5:30, Cliff wrote:
>
> Thank you, Sundar.
>
> I understand. This solution means I relinquish the foreign key constraint
> on the product_lots table.
>
> It does seem simpler than using another table for raw materials.
>
> No third alternative, I guess...
>
> On Friday, April 20, 2012 2:37:38 AM UTC-4, Sundar wrote:
>>
>> Cliff
>>
>> By adding the 'null' to the 'purchase_order_id' in the product_lots
>> table, you automatically achieve it - that is, if the field is declared as
>> Null, foreign key constraint is applicable only if it is non-null and a
>> null value will automatically skip validation for foreign key.
>>
>> Another method (not really required, I guess) is to define a 'dummy' PO
>> with id as zero (or non-negative) and refer to this PO in all product lots
>> which do not require any PO reference. However, this method will mean that
>> you have to have an additional where clause in all selects (on the PO
>> table) to exclude this specific PO.
>>
>> Cheers.
>>
>> Sundar
>> ==============================================
>> On Friday, April 20, 2012 3:16:24 AM UTC+5:30, Cliff wrote:
>>>
>>> nick,
>>> Thanks for the response.
>>>
>>> Here's a longer explanation.
>>>
>>> Two applications, one is purchasing, the other is production.
>>>
>>> Purchasing has two tables, purchase_orders and product_lots. It's a
>>> one-to-may relationship; a purchase order can have many product lots. So
>>> we get:
>>> db.define_table('purchase_orders', field('po_number' .....
>>> db.define_table('product_lots', Field('purchase_order_id',
>>> db.purchase_orders, requires=IS_IN_DB(db, 'purchase_orders.id', ...)),
>>> Field('quantity_received', 'decimal'), Field('quantity_on_hand',
>>> 'decimal') ...
>>>
>>> So, I have established a foreign table relationship between purchase
>>> orders and product lots.
>>>
>>> Once a product_lot is released to production, the production app uses
>>> the same table to find available raw materials, and decrements the
>>> quantity_on_hand field as it goes. The production app neither knows nor
>>> cares about the purchase order table, so the purchase_order_id field is
>>> irrelevant.
>>>
>>> This is fine as long as all production material enters the plant via the
>>> purchasing process. However, this is not the case. So, either I devise a
>>> way to get records into the product lots table without violating the
>>> foreign key constraint that Postgres would apply. One way would be to
>>> define the purchase_order_id field as an integer and handle the key
>>> relationships through code. Not attractive.
>>>
>>> Another way would be to establish a third table for raw materials. This
>>> would be a clone of the product_lots table but it would not have a foreign
>>> key to purchase_orders. The purchase_order controller would then need to
>>> create and update records in the raw materials table, while several
>>> controllers in the production app would also create and update records in
>>> the table as well. I don't like this solution much, either.
>>>
>>> Can anybody suggest another approach?
>>>
>>>
>>>
>>> On Thursday, April 19, 2012 1:03:41 PM UTC-4, nick name wrote:
>>>>
>>>> I don't understand what you are trying to achieve, but whatever it is,
>>>> you are doing it wrong; your model should be:
>>>>
>>>> db.define_table('A', Field('name'))
>>>>
>>>> db.define_table('B', Field('name'), Field('id_from_table_a', 'reference
>>>> A'))
>>>> # alternatively:
>>>> # db.define_table('B', Field('name'), Field('id_from_table_a', db.A))
>>>>
>>>> This would create the foreign key reference, and would allow nulls by
>>>> default (which is what your condition does).
>>>>
>>>> But as I said, I'm not sure exactly what you are trying to achieve?
>>>>
>>>> On Wednesday, April 18, 2012 7:11:42 PM UTC-4, Cliff wrote:
>>>>>
>>>>> There are two tables, as follows:
>>>>>
>>>>> db.define_table('A', Field('name'))
>>>>>
>>>>> db.define_table('B', Field('name'), Field('id_from_table_a))
>>>>>
>>>>> Also there are two applications. One, called 'both_a_and_b', uses
>>>>> both tables and uses 'table_a_id' as a foreign key in table B. The
>>>>> other,
>>>>> called 'table_b_only' needs CRUD access to the information in table B,
>>>>> but
>>>>> it is not able to supply a value for 'id_from_table_a.'
>>>>>
>>>>> I think because Postgres recognizes foreign key constraints,
>>>>> 'table_b_only' will not be able to create records in table B.
>>>>>
>>>>> What Is the right solution?
>>>>>
>>>>> I can think of two. First, create a third table, C, for all the data
>>>>> that 'table_b_only' needs. This table would not have the
>>>>> 'id_from_table_a'
>>>>> field. The other application would need to write also to this table
>>>>> whenever it creates a record in table B.
>>>>>
>>>>> A second possibility might be to define table B this way:
>>>>> db.define_table('B',
>>>>> Field('name') ,
>>>>> Field('id_from_table_a', requires= IS_EMPTY_OR(IS_IN_DB(db, 'A.id',
>>>>> ...)))
>>>>> )
>>>>>
>>>>> I would be grateful for any guidance,
>>>>> Cliff Kachinske
>>>>>
>>>>