Thread

  1. Need help understanding unique indices (fwd)

    Marc Howard Zuckman <marc@fallon.classyad.com> — 1998-06-15T15:53:16Z

    This message received no replies from the SQL list and I forward
    it to hackers looking for additional thoughts.
    
    EXECUTIVE SUMMARY:
    
    I have two tables with identical structure.
    One table has a unique index on 5 of the 
    6 table attributes.
    
    When attempting to insert from the non-indexed
    table into the uniquely indexed table, the
    insert fails due to "duplicate key" error. (index definition below)
    
    However, this query, which tries to identify tuples with identical keys,
    returns 0 rows.  Each attribute included in the multifield index
    is qualified in the where clause.  Why doesn't the
    select show the duplicate tuples?
    
     select newpropsales.* from newpropsales n, propsales p
     where n.city=p.city and n.county=p.county and
     n.street=p.street and n.streetno=p.streetno and
     n.closingdate=p.closingdate ;
    
    closingdate|county|city|streetno|street|price
    - -----------+------+----+--------+------+-----
    (0 rows)
    
    
    ---------- Forwarded message ----------
    Date: Fri, 5 Jun 1998 19:42:21 -0400 (EDT)
    From: Marc Howard Zuckman <marc@fallon.classyad.com>
    Subject: Need help understanding unique indices
    
    I have a  need to incrementally add new data to a table with this
    structure:
    Table    = propsales
    +----------------------------------+----------------------------------+-------+
    |              Field               |              Type                | Length|
    +----------------------------------+----------------------------------+-------+
    | closingdate                      | date                             |     4 |
    | county                           | varchar()                        |    50 |
    | city                             | varchar()                        |    50 |
    | streetno                         | varchar()                        |    10 |
    | street                           | varchar()                        |    70 |
    | price                            | float8                           |     8 |
    +----------------------------------+----------------------------------+-------+
    
    A second table, newpropsales, exists with identical structure.
    
    The original table, propsales has a unique index that includes all of the
    record fields except the price field.  The index is defined as follows:
    
    CREATE UNIQUE INDEX propsales_key on propsales using btree ( city varchar_ops, 
    street varchar_ops, streetno varchar_ops,
    county varchar_ops, closingdate date_ops );
    
    When loading new data into the database, it is loaded into table
    newpropsales.  An effort to remvove duplicate tuples is then made
    using this series of queries:
    
    delete from recentpropsales; --temporary table with identical structure to those above.
    - -- get rid of any duplicates contained solely within newpropsales
    insert into recentpropsales select distinct * from newpropsales; 
    delete from newpropsales;
    insert into newpropsales select * from recentpropsales;
    delete from recentpropsales;
    delete from newminclosingdate;
    insert into newminclosingdate select min(closingdate) from newpropsales;
    - -- get tuples from accumulated data that are in same time frame as new data.
    insert into recentpropsales select propsales.* from propsales,newminclosingdate where 
    closingdate >= newminclosingdate.min;
    
    - -- attempt to eliminate duplicates tuples that are present in
    - -- both tables considered together
    - --  This will NOT eliminate all index duplicates because
    - --    price is not indexed.  Therefore, tuples that are identical
    - -- in every way but have different price values will not be
    - -- deleted from the new data set.
    
    delete from newpropsales where exists (
    select city from recentpropsales r where
    r.county=newpropsales.county and r.price=newpropsales.price and
    r.city=newpropsales.city and r.closingdate=newpropsales.closingdate
    and r.street=newpropsales.street and r.streetno=newpropsales.streetno);
    
    All of this seems to work ok.  But, this fails
    
    insert into propsales select * from newpropsales;
    
    because a duplicate key is encountered.
    
    However, this query, which tries to identify tuples with identical keys,
    returns 0 rows.  Why?
    
     select newpropsales.* from newpropsales n, propsales p
     where n.city=p.city and n.county=p.county and
     n.street=p.street and n.streetno=p.streetno and
     n.closingdate=p.closingdate ;
    
    closingdate|county|city|streetno|street|price
    - -----------+------+----+--------+------+-----
    (0 rows)
    
    
    Marc Zuckman
    marc@fallon.classyad.com
    
    _\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_
    _     Visit The Home and Condo MarketPlace		      _
    _          http://www.ClassyAd.com			      _
    _							      _
    _  FREE basic property listings/advertisements and searches.  _
    _							      _
    _  Try our premium, yet inexpensive services for a real	      _
    _   selling or buying edge!				      _
    _\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_