使用尚未创建的外键插入mySQL表

时间:2010-04-09 20:36:45

标签: sql phpmyadmin

好的,我有两张桌子。他们都有钥匙。我有另一个表引用两个键。如果我添加到第三个中,如果前两个表中不存在任何一个键,它将不会将该元组插入第三个表中,那么如何创建约束。我在phpMyAdmin中插入。谢谢。

2 个答案:

答案 0 :(得分:1)

修改

很抱歉误读了您的问题。 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;

这将禁用sql语句反映的FK检查,直到执行插入后。如果我没记错的话,它会在重新打开后检查按键。因此,您可能希望使用事务,以便在出现错误并且密钥最终不匹配时可以回滚。否则你可能有部分数据从来没有乐趣: - )

答案 1 :(得分:0)

我不知道约束,但您可以使用此插入查询:
    INSERT INTO TAB3(TAB3_key1,TAB3_key2)SELECT val1,val2 FROM TAB1 JOIN TAB2 ON EXISTS(SELECT * FROM TAB1 JOIN TAB2 ON TAB1_key = val1 AND TAB2_key = val2)LIMIT 1;

其中val1,val2 - 要插入的值。