EDIT
Извините, что неправильно прочитал ваш вопрос. Mysql поддерживает ограничения только с некоторыми двигателями. InnoDB - это тот, о котором я знаю и которым обычно пользуюсь, но другой может быть, я действительно не уверен. Таким образом, с inno DB вам понадобится следующая схема:
CREATE TABLE my_table_a (
`id` INTEGER UNSIGNED NOT NULL auto_increment,
# your other column definitions
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
CREATE TABLE my_table_b (
`id` INTEGER UNSIGNED NOT NULL auto_increment,
# your other column definitions
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
CREATE TABLE my_table_a_b (
`id` INTEGER UNSIGNED NOT NULL auto_increment,
`table_a_id` INTEGER UNSIGNED NOT NULL,
`table_b_id` INTEGER UNSIGNED NOT NULL
PRIMARY KEY (`id`),
KEY (`table_a_id`),
KEY (`table_b_id`),
CONSTRAINT `ab_FK_a`
FOREIGN KEY (`table_a_id`)
REFERENCES `my_table_a` (`id`),
CONSTRAINT `ab_FK_b`
FOREIGN KEY (`table_b_id`)
REFERENCES `my_table_b` (`id`)
) ENGINE=InnoDB;
SET FOREIGN_KEY_CHECKS=0;
# Your INSERTS
SET FOREIGN_KEY_CHECKS=1;
Это отключит проверки FK, как отражают операторы sql, до тех пор, пока вы не выполните вставки. Если я правильно помню, он проверит ключи после включения. Из-за этого вы можете захотеть использовать транзакцию, чтобы откатиться, если вы допустили ошибку и ключи не совпадают в конце. В противном случае у вас могут быть частичные данные, которые никогда не доставляют удовольствия: -)