Forgive me for listening in as I don't actually design any DBD modules.  But
from a user standpoint, I am probably one of the few individuals you will
find that actually has both a PK and a UNIQUE constraint on a table.  With
some child tables referencing the PK and some referencing the Unique.  This
is do to a legacy problem with the schema which I hope to fix so that all
children reference the PK.  I know this kind of relationship is a bad thing
( for instance it confuses the heck out of ER Studio).  However, it is
achievable in at least Oracle and Sybase.  Which brings me to my point...

Why not support both types?
   SQL/CLI            ODBC
   -----------------  -------------
   UK_TABLE_CAT       PKTABLE_CAT
   UK_TABLE_SCHEM     PKTABLE_SCHEM
   UK_TABLE_NAME      PKTABLE_NAME
   UK_COLUMN_NAME     PKCOLUMN_NAME

DBDs with no concept of Unique constraints (or PKs for that matter) could
just return -1 or something.


> -----Original Message-----
> From: Kerspern, Nicolas [mailto:[EMAIL PROTECTED]]
> Sent: Monday, September 17, 2001 2:32 AM
> To: [EMAIL PROTECTED]
> Subject: RE: DBI: Foreign Key metadata
>
>
>
>
> -----Original Message-----
> From: Tim Bunce [mailto:[EMAIL PROTECTED]]
> Sent: Monday, September 17, 2001 11:30 AM
> To: Steffen Goeldner
> Cc: [EMAIL PROTECTED]; [EMAIL PROTECTED]
> Subject: Re: DBI: Foreign Key metadata
>
>
> On Mon, Sep 17, 2001 at 09:34:51AM +0200, Steffen Goeldner wrote:
> > Both, SQL/CLI and ODBC define a function 'SQLForeignKeys' for
> > obtaining foreign key metadata:
> >
> >   SQLRETURN SQLForeignKeys
> >   (
> >     SQLHSTMT  StatementHandle,
> >     SQLCHAR*  PKCatalogName  , SQLSMALLINT  NameLength1,
> >     SQLCHAR*  PKSchemaName   , SQLSMALLINT  NameLength2,
> >     SQLCHAR*  PKTableName    , SQLSMALLINT  NameLength3,
> >     SQLCHAR*  FKCatalogName  , SQLSMALLINT  NameLength4,
> >     SQLCHAR*  FKSchemaName   , SQLSMALLINT  NameLength5,
> >     SQLCHAR*  FKTableName    , SQLSMALLINT  NameLength6
> >   );
> >
> > A perlish interface - similar to table_info and primary_key_info -
> > may look like:
> >
> >   $sth = $dbh->foreign_key_info( $PKCatalog, $PKSchema, $PKTable
> >                                , $FKCatalog, $FKSchema, $FKTable );
> >
> > - $PK* identifies the primary key table.
> > - $FK* identifies the foreign key table.
> > - These parameters cannot contain string search patterns.
> > - If both $PK* and $FK* are given, the function returns the foreign key
> >   (if any) in table $FK* that refers to the primary key of table $PK*.
> >   (Note: In SQL/CLI, the result is implementation-defined.)
> > - If only $PK* is given, then the result set contains the primary key
> >   of that table and all foreign keys that refer to it.
> > - If only $FK* is given, then the result set contains all foreign keys
> >   in that table and the primary keys to which they refer.
> >   (Note: In SQL/CLI, the result includes unique keys too.)
> >
> > Because ODBC never includes unique keys, they define other columns
> > in the result set than SQL/CLI:
> >
> >   SQL/CLI            ODBC
> >   -----------------  -------------
> >   UK_TABLE_CAT       PKTABLE_CAT
> >   UK_TABLE_SCHEM     PKTABLE_SCHEM
> >   UK_TABLE_NAME      PKTABLE_NAME
> >   UK_COLUMN_NAME     PKCOLUMN_NAME
> >   FK_TABLE_CAT       FKTABLE_CAT
> >   FK_TABLE_SCHEM     FKTABLE_SCHEM
> >   FK_TABLE_NAME      FKTABLE_NAME
> >   FK_COLUMN_NAME     FKCOLUMN_NAME
> >   ORDINAL_POSITION   KEY_SEQ
> >   UPDATE_RULE        UPDATE_RULE
> >   DELETE_RULE        DELETE_RULE
> >   FK_NAME            FK_NAME
> >   UK_NAME            PK_NAME
> >   DEFERABILITY       DEFERRABILITY
> >   UNIQUE_OR_PRIMARY
> >
> > The question is, which specification should DBI support?
>
> I'd suggest ODBC with UNIQUE_OR_PRIMARY optionally tacked into the end.
>
> (My general philosophy is that it ought to be possible to interchange
> using DBD::Foo with DBD::ODBC (plus Foo's ODBC driver) with little or
> no change to the application.)
>
> Tim.
>

Reply via email to