thanks for the advice Stephen. I'll admit though I am somewhat loathe to
adding an artifical row in the other tables, but it may not be a bad way
to go. In the past, I've written triggers to do this kind of check, but
mysql doesn't yet support triggers.
what I ended up doing is carefully rethinking the schema. It turns out
we came up with a better design that does not require the table_name,
table_id linking mechanism. We just link into one table, which of course
presents no problems in creating a foreign key constraint.
jeff
Stephen Giese wrote:
>
> Jeff,
>
> We faced a similar challenge in an application: Each child record must have
> a parent in one of two tables, TabA or TabB, but not both. We "solved" it
> by adding a foreign-key field for each possible parent in the child
> table. Each column can have the FK constraint. We were using Sybase, but
> I translate the DDL to MySQL below.
>
> create table Example (
> id int not null auto_increment primary key,
> tableA_id int not null,
> tableB_id int not null
> ) type = InnoDB;
> alter table Example add index (tableA_id);
> alter table Example add index (tableB_id);
> alter table Example add constraint foreign key (tableA_id) references TabA(id);
> alter table Example add constraint foreign key (tableB_id) references TabB(id);
>
> However, you will notice that each child record now must have a parent
> record in BOTH parent tables. We used our front end to enforce a rule that
> the one of the two foreign key fields is always -1 (or some other default
> value). Then we insert a record into each parent with a key value that
> matches our default (-1).
>
> This method is not as easily extensible as your model, but perhaps that's
> OK. In SQL to join the parent and child you must decide which parent to
> join based on which FK column has the non-default value.
>
> You might be able to come up with a DB rule to ensure that exactly one of
> the FK values is non-default.
>
> Stephe
>
> At 09:26 AM 4/2/2003 -0700, Jeff Mathis wrote:
> >Thanks,
> >but I think the lik you provided won't help. I know how to create pk/fk
> >contraints, and do in our schema, when the foreign key is completely
> >specified. for example, if my original table was instead:
> >
> >create table Example (
> > id int not null auto_increment primary key,
> > fk_id int not null
> >) type = InnoDB;
> >
> >then I create an index in fk_id, and issue the alter table statement:
> >alter table Example add constraint foreign key (fk_id) references
> >Fk(id);
> >
> >for an InnoDB table called Fk.
> >
> >What I need to do is somehow put an "if" statement in there. If
> >table_name = 'TabA', then verify that TabA.id exists. If table_name =
> >'TabB', then verify that TabB.id exists. TabA and TabB, for the present
> >purposes, could simply be
> >
> >create table TabA {
> > id int not null auto_increment primary key
> >) type = InnoDB;
> >
> >create table TabB {
> > id int not null auto_increment primary key
> >) type = InnoDB;
> >
> >
> >Its as though I could do the following:
> >
> >create table Example (
> > id int not null auto_increment primary key,
> > table_name enum('TabA','TabB') not null,
> > table_id int not null
> >) type = InnoDB;
> >alter table Example add index (table_id);
> >alter table Example add constraint foreign key (table_id) references
> > (if table_name = 'TabA' then TabA(id) else TabB(id);
> >
> >but I don't think this works.
> >
> >jeff
> >
--
Jeff Mathis, Ph.D. 505-955-1434
The Prediction Company [EMAIL PROTECTED]
525 Camino de los Marquez, Ste 6 http://www.predict.com
Santa Fe, NM 87505
--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]