代码之家  ›  专栏  ›  技术社区  ›  Rolf

如何将自动递增的主键也用作外键?

  •  5
  • Rolf  · 技术社区  · 14 年前

    这就是我要做的:

    我有两张桌子。。。

    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;
    

    然后是一个约束:

    ALTER TABLE `parent` ADD FOREIGN KEY (`id`) REFERENCES `child` (`parent_id`);
    

    现在我想在父表中插入一条记录,如下所示:

    INSERT INTO parent SET DATA="abc";
    

    它失败了,出现了错误:

    外键约束失败 myschema parent ,约束 parent_ibfk_1 外键( id ) 参考文献 child parent_id ))

    如果子表中没有相关行,我看不到插入阻塞的实用性。。。

    我只是想建立一对多的关系。。。

    2 回复  |  直到 6 年前
        1
  •  11
  •   Daniel Vassallo    14 年前

    看起来引用表和被引用表是相反的。您可能需要执行以下操作:

    ALTER TABLE `child ` ADD FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`);
    

    也可以在中定义外键 CREATE TABLE 声明如下:

    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`),
      FOREIGN KEY (`parent_id`) REFERENCES `parent`(`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    INSERT INTO parent (`data`) VALUES ('test data 1');
    Query OK, 1 row affected (0.01 sec)
    
    INSERT INTO parent (`data`) VALUES ('test data 2');
    Query OK, 1 row affected (0.01 sec)
    
    INSERT INTO child (`parent_id`, `related_ids`) VALUES (1, 100);
    Query OK, 1 row affected (0.01 sec)
    
    INSERT INTO child (`parent_id`, `related_ids`) VALUES (2, 100);
    Query OK, 1 row affected (0.01 sec)
    
    INSERT INTO child (`parent_id`, `related_ids`) VALUES (3, 100);
    ERROR 1452 (23000): Cannot add or update a child row: 
      a foreign key constraint fails 
    
        2
  •  1
  •   Rolf    14 年前

    休斯敦大学。。。我想我倒过来了。 似乎我需要将外键添加到子表中,如下所示:

    ALTER TABLE `child` ADD FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`);
    

    我很难处理MySQL术语。你能怪我吗?