Вставка в таблицу MySQL с внешним ключом, который еще не был создан - PullRequest
0 голосов
/ 10 апреля 2010

Хорошо, у меня есть две таблицы. У них обоих есть ключи. У меня есть другая таблица, которая ссылается на оба ключа. Как сделать ограничение, когда я добавляю в эту третью, если ни один из ключей не существует в первых двух таблицах, он не вставит этот кортеж в третью таблицу. Я вставляю в phpMyAdmin. Благодарю.

Ответы [ 2 ]

1 голос
/ 10 апреля 2010

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, до тех пор, пока вы не выполните вставки. Если я правильно помню, он проверит ключи после включения. Из-за этого вы можете захотеть использовать транзакцию, чтобы откатиться, если вы допустили ошибку и ключи не совпадают в конце. В противном случае у вас могут быть частичные данные, которые никогда не доставляют удовольствия: -)

0 голосов
/ 10 апреля 2010

Я не знаю об ограничении, но вы можете использовать этот запрос вставки:
INSERT INTO TAB3 (TAB3_key1, TAB3_key2) ВЫБЕРИТЕ val1, val2 ИЗ TAB1 ПРИСОЕДИНЯЙТЕСЬ К TAB2 В СУЩЕСТВЕ (ВЫБЕРИТЕ * ИЗ TAB1 ПРИСОЕДИНЯЙТЕСЬ К TAB2 ON TAB1_key = val1 И TAB2_key = val2) LIMIT 1;

где val1, val2 - значения, которые вы хотите вставить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...