Michael, Thank you for your reply. Here is a bit more info. I changed the default table type to innodn in the my.ini file before creating the database, so all tables are innodb. I tried the create statements with and without explicit index clauses with all permutations - same result each time. I agree that something is wrong. Did you try running the ddl you suggested below? If so, did it work for you?
I downloaded the latest release from thr ANL mirror which says v 4.1.2 in the file name. When I run MySQL, the system says it is 4.0.22. Is the engine version different than the release version? This is a secondaary issue however. Steve -------------- Original message -------------- > Something is wrong, but it's hard to say what. It seems unlikely you entered > exactly those commands and got an error only on the last ALTER TABLE. > First, you need InnoDB tables to support foreign keys, but you don't specify > the table engine in your CREATE statements. The default is MyISAM, unless > you've changed it. But that's not it. If they were MyISAM tables, neither > ALTER would work, but if they're all InnoDB, then all should work. Is it > possible that just table address is MyISAM? > > In order to create a foreign key, you must have an index on the columns on > each side of the relationship. That is, you need person_id and address_id > to be indexed in both tables. Prior to 4.1.2, you had to do that by hand, > but in 4.1.2 and later it's automatic. Again, all or nothing, so not likely > relevant here. > > > Some other things to note (which are unrelated to the error): > > There is no need to put an index on a column which has already been indexed > as the primary key. It's a waste of space that adds overhead to inserts. > > You are relying on MySQL to create indexes for you in table person_address, > but I don't think it will make the best choices in this case. You need an > index on each column, but you most likely also need the combination of > person_id and address_id to be unique. In other words, if you let mysql > create indexes for you to satisfy the foreign key needs, you get separate > single-column indexes, but you need a combined column unique constraint > which renders one of the single column indexes redundant. > > How about: > > CREATE TABLE person > ( > person_id INT UNSIGNED NOT NULL AUTO_INCREMENT, > constraint person_pk PRIMARY KEY (person_id) > ) ENGINE=InnoDB; > > CREATE TABLE address > ( > address_id INT UNSIGNED NOT NULL AUTO_INCREMENT, > constraint address_pk PRIMARY KEY (address_id) > ) ENGINE=InnoDB; > > CREATE TABLE person_address > ( > person_id INT UNSIGNED NOT NULL, > address_id INT UNSIGNED NOT NULL, > CONSTRAINT person_address_pk PRIMARY KEY (person_id, address_id), > INDEX (address_id), > CONSTRAINT person_person_address_FK1 > FOREIGN KEY (person_id) REFERENCES person (person_id); > CONSTRAINT address_person_address_FK1 > FOREIGN KEY (address_id) REFERENCES address (address_id); > ) ENGINE=InnoDB; > > Michael > > [EMAIL PROTECTED] wrote: > > > I am unable to define a foreign key with the following three tables. I > > am unable to find the error having searched the documentation and tried > > several variations. > > > > Note that I created the first two tables with and without the index > > clause in the table ddl with no difference in outcome. > > > > The three tables and the first foreign key, person_person_address_FK1, > > create properly. The second foreign key, address_person_address_FK1, > > causes the error. > > > > Please help. > > > > create table person ( > > person_id int unsigned not null auto_increment, > > constraint person_pk primary key (person_id), > > index(person_id)); > > > > create table address ( > > address_id int unsigned not null auto_increment, > > constraint address_pk primary key (address_id), > > index(address_id)); > > > > create table person_address ( > > person_id int unsigned not null, > > address_id int unsigned not null); > > > > -- This statement works. > > alter table person_address > > add constraint person_person_address_FK1 > > foreign key (person_id) references person (person_id); > > > > -- This statement fails. > > alter table person_address > > add constraint address_person_address_FK1 > > foreign key (address_id) references address (address_id); > > > > Replies may be sent to [EMAIL PROTECTED] > > > > Thank you! > > > > Steve >