This is what I'm trying to do:
I have 2 tables...
CREATE TABLE `parent` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`data` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
CREATE TABLE `child` (
`parent_id` int(11) DEFAULT NULL,
`related_ids` int(11) DEFAULT NULL,
KEY `parent_id` (`parent_id`),
KEY `related_ids` (`related_ids`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
And then a constraint:
ALTER TABLE `parent` ADD FOREIGN KEY (`id`) REFERENCES `child` (`parent_id`);
As you can see the table parent has an auto-incremented primary key "id", which is also being used as a foreign key for the child table.
Now I want to insert a record in the parent table, like this:
INSERT INTO parent SET DATA="abc";
And it fails with error:
Cannot add or update a child row: a foreign key constraint fails (
myschema
.parent
, CONSTRAINTparent_ibfk_1
FOREIGN KEY (id
) REFERENCESchild
(parent_id
))
I understand that it fails because it doesn't find a referred record in the child table. If I start by creating a record in the child table, set it's parent_id to 1, then reset the auto-increment counter of the parent table (so that the next insert will have id = 1), it works! But that's not a solution.
I don't see the utility of the insert blocking if there is no related row in the child table...
I'm just trying to do a one-to-many relationship...
(I know I can use JOIN, but I'm trying to use table relations, for data integrity and also as metadata for PHP)
It looks like you have the referencing and referenced tables in reverse. You may want to do:
You can also define the foreign key in the
CREATE TABLE
statement, as follows:Test case:
Uh... I think I got it backwards. It seems that I need to add the foreign key to the child table, like that:
I'm having a hard time dealing with MySQL terminology. Can you blame me?