外键,更多的障碍然后有用吗?

时间:2014-07-22 13:42:48

标签: mysql foreign-keys

我使用mysql workbench来设计数据库。我使用该工具在表之间创建漂亮的行,这会自动添加到外键中。

以下是我的2个创建语句:

CREATE TABLE IF NOT EXISTS `mydb`.`PROFILE` (
  `user_id` INT NOT NULL,
  `some_int` BIGINT NULL COMMENT 'an int',
  PRIMARY KEY (`user_id`),
  UNIQUE INDEX `user_id_UNIQUE` (`user_id` ASC))
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `mydb`.`USER_ACCOUNT` (
  `user_id` INT NOT NULL AUTO_INCREMENT,
  `field1` VARCHAR(100) NOT NULL,
  `field2` CHAR(32) NOT NULL,
  `PROFILE_user_id` INT NOT NULL,
  PRIMARY KEY (`user_id`),
  UNIQUE INDEX `email_address_UNIQUE` (`email_address` ASC),
  INDEX `fk_USER_ACCOUNT_PROFILE1_idx` (`PROFILE_user_id` ASC),
  CONSTRAINT `fk_USER_ACCOUNT_PROFILE1`
    FOREIGN KEY (`PROFILE_user_id`)
    REFERENCES `mydb`.`PROFILE` (`user_id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

我无法插入到ERROR 1452: Cannot add or update a child row: a foreign key constraint fails之类的内容中 - 我尝试先插入孩子,但似乎没有什么区别。

然后我认为,因为我画了一个1:1的关系,密钥必须对PROFILE中的每个条目都有意义我在USER_ACCOUNT中有一个条目 - 否则外键的重点是什么?使用这个想法我首先插入到子节点中,然后使用相同的user_id为父节点写了更新查询,更新不起作用。

所以我的第一个问题是,这个外键有什么意义?我知道桌子之间有1:1的关系,所以我应该强制执行吗?

其次,我该如何插入?我自己的外键不允许我插入数据。

谢谢,任何帮助都会很棒我在DB设计上有点生疏。

1 个答案:

答案 0 :(得分:1)

首先,您不需要UNIQUE PRIMARY KEY PRIMARY KEY已经执行的CREATE TABLE IF NOT EXISTS `mydb`.`USER_ACCOUNT` ( `user_id` INT NOT NULL AUTO_INCREMENT, `field1` VARCHAR(100) NOT NULL, `field2` CHAR(32) NOT NULL, PRIMARY KEY (`user_id`), UNIQUE INDEX `email_address_UNIQUE` (`email_address` ASC) ) ENGINE = InnoDB; CREATE TABLE IF NOT EXISTS `mydb`.`PROFILE` ( `user_id` INT NOT NULL, `some_int` BIGINT NULL COMMENT 'an int', PRIMARY KEY (`user_id`), CONSTRAINT `fk_PROFILE_USER_ACCOUNT1` FOREIGN KEY (`user_id`) REFERENCES `mydb`.`USER_ACCOUNT` (`user_id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE = InnoDB; 索引。

其次,从概念上讲,您已将外键添加到错误的表中,因为配置文件应引用用户..这可能是您的问题来自的地方。

我建议使用以下DDL:

USER_ACCOUNT

然后将您的用户插入PROFILE,然后{{1}}。

Q值。我应该强制执行外键吗?

一个。几乎可以肯定,它可以防止您的数据进入不一致的状态。可以添加具有已删除用户或不存在的用户的配置文件。了解您的数据始终保持一致使查询,显示数据和调试变得更加容易,因为不用担心。