Axel Rau wrote:
Thank you for responding, Daryl,

Am 22.09.2005 um 16:45 schrieb Daryl Richter:

Axel Rau wrote:

Hi SQLers,
I have a fk from address to network and try to update the foreign key column to point at the network, "it belongs to":
CREATE TABLE network (
  id      cidr     PRIMARY KEY     , -- 'PK, ,IPv4/6 Network address'
)
CREATE TABLE address (
  id         inet     PRIMARY KEY      , -- 'PK of IPv4/6 host address'
  network cidr     NOT NULL            -- 'FK to Network table'
REFERENCES network ON DELETE CASCADE ON UPDATE CASCADE
)
I tried (using the WHERE clause to eliminate the addresses were no corresponding net exists):


But you can't insert a row in address w/o a valid network.id? That's what the fk ensures.

Perhaps you could elaborate more? Are you trying to *put* on the fk and you currently have bad data?

The fk requires a corresponding row in network. But my update tries to reference the right network, that one where the ip address belongs to.

I'm still not understanding what you're trying to do, perhaps its a language issue. :) Let me try again.

I built your schema and inserted some rows:

    insert into network( id ) values( '10.1' );

    insert into address( id, network ) values( '10.1.0.1', '10.1' );
    insert into address( id, network ) values( '10.1.0.2', '10.1' );
    insert into address( id, network ) values( '10.1.0.3', '10.1' );

I then select from network:

    id
    -----------
    10.1.0.0/16

and from address:

    id        network
    --------  -----------
    10.1.0.1  10.1.0.0/16
    10.1.0.2  10.1.0.0/16
    10.1.0.3  10.1.0.0/16

Why do you now want to update address.network? They are already pointing to the right network, aren't they?

I think if you provide some sample data we can figure this out.



UPDATE address
    SET network = (SELECT N.id WHERE A.id << N.id)
    FROM address A, network N
    WHERE A.id << N.id;


This also makes no sense.  For starters, << is "bitwise shift left" ...

I'm using 8.0.3 and there are some new operators related to inet and cidr data types.
On page 157, I found "<<" as address/network "is contained in" network.

Finding the net where an address belongs to works as:
    SELECT id FROM network WHERE inet '$p_ipSource' << id;


Ahh, ok.  see above.

Axel

Axel Rau, Frankfurt, Germany                           +49-69-951418-0


---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings


--
Daryl


---------------------------(end of broadcast)---------------------------
TIP 6: explain analyze is your friend

Reply via email to