This is a question onto defining foreign keys in a relational database. Foreign keys are featured by the InnoDB engine and therefore all three tables of the database use it:

1. `friends` main table
2. `relation` deploys a simple relation between rows of the main table, '1-2' means '1 is friend of 2' 3. `category` table with two columns, integer primary key and referring text explanation. It is for distributing persons of the `friends` table into categories. All three tables have an id column defined as smallint(5) unsigned NOT NULL auto_increment as their first column. (that is trying to be used to establish the FOREIGN KEY definitions)

Here is the output of the mysql client:

mysql> SHOW CREATE TABLE friends\G
*************************** 1. row ***************************
      Table: friends
Create Table: CREATE TABLE `friends` (
 `id` smallint(5) unsigned NOT NULL auto_increment,
 `firstname` varchar(22) collate latin1_german2_ci default NULL,
 `lastname` varchar(30) collate latin1_german2_ci default NULL,
 `nick` varchar(20) collate latin1_german2_ci default NULL,
 `birthdate` date default NULL,
 `gender` enum('m','f') collate latin1_german2_ci default 'm',
 `category` smallint(5) unsigned default '0',
 `phonehome` varchar(30) collate latin1_german2_ci default NULL,
 `phonework` varchar(30) collate latin1_german2_ci default NULL,
 `phonemobile` varchar(30) collate latin1_german2_ci default NULL,
 `email` varchar(38) collate latin1_german2_ci default NULL,
 `street` varchar(38) collate latin1_german2_ci default NULL,
 `town` varchar(28) collate latin1_german2_ci default NULL,
 `zip` smallint(5) unsigned default NULL,
 `country` char(3) collate latin1_german2_ci default NULL,
`lastupdate` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TI
MESTAMP,
 PRIMARY KEY  (`id`),
 UNIQUE KEY `Name` (`lastname`,`firstname`)
) *ENGINE=InnoDB* DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci
1 row in set (0.00 sec)

mysql> SHOW CREATE TABLE relation\G
*************************** 1. row ***************************
      Table: relation
Create Table: CREATE TABLE `relation` (
 `id` smallint(5) unsigned NOT NULL,
 `idx` smallint(5) unsigned NOT NULL,
 KEY `idx` (`idx`),
 KEY `id` (`id`),
CONSTRAINT `relation_ibfk_1` FOREIGN KEY (`idx`) REFERENCES `friends` (`id`), CONSTRAINT `relation_ibfk_2` FOREIGN KEY (`id`) REFERENCES `friends` (`id`)
) *ENGINE=InnoDB* DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

mysql> SHOW CREATE TABLE category\G
*************************** 1. row ***************************
      Table: category
Create Table: CREATE TABLE `category` (
 `id` smallint(5) unsigned NOT NULL auto_increment,
 `name` char(40) NOT NULL,
 PRIMARY KEY  (`id`),
 UNIQUE KEY `name` (`name`)
) *ENGINE=InnoDB* DEFAULT CHARSET=latin1
1 row in set (0.01 sec)


---------------------------------------------------------------------------------------------------------------
Now the following FOREIGN KEY definitions work, defining FOREIGN KEY relations from `relation` to `friends`:

ALTER TABLE `relation` ADD FOREIGN KEY (id) REFERENCES friends(id);
ALTER TABLE `relation` ADD FOREIGN KEY (idx) REFERENCES friends(id);

---------------------------------------------------------------------------------------------------------------
Only the one defining a FOREIGN KEY out of the main table `friends` onto `categories` does not work:

mysql> ALTER TABLE friends ADD FOREIGN KEY (category) REFERENCES category(id);
*ERROR 1452 (23000): Cannot add or update a child row*:
a foreign key constraint fails (`kontakte/#sql-73c_7`, CONSTRAINT `#sql-73c_7_ibfk_1` FOREIGN KEY (`catego
ry`) REFERENCES `category` (`id`))
mysql>

Does anyone see why this does not work? (Other than repeating the error message?)
How do I get it to work?

Regards,
Andy, Germany




Reply via email to