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

Mysql 外键,更多的障碍然后有用吗?,mysql,foreign-keys,Mysql,Foreign Keys,我使用mysql workbench设计了一个数据库。我用这个工具在表之间画出漂亮的线条,这会自动为我添加一个外键 以下是我的两条create语句: 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` (

我使用mysql workbench设计了一个数据库。我用这个工具在表之间画出漂亮的线条,这会自动为我添加一个外键

以下是我的两条create语句:

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;
我无法插入子行,除非遇到类似以下情况:错误1452:无法添加或更新子行:外键约束失败-我尝试先插入子行,但似乎没有什么不同

然后我想,既然我画了一个1:1的关系,那么这个键必须意味着对于配置文件中的每个条目,我在USER_帐户中都有一个条目——否则外键的意义是什么?使用这个想法,我先将其插入到子系统中,然后使用相同的用户id为父系统编写了一个更新查询,但更新不起作用

那么我的第一个问题,外键的意义是什么?我知道表之间存在1:1的关系,所以我应该强制执行它吗

第二,我该如何插入这一点?我自己的外键不允许我插入数据


谢谢,任何帮助都会很好。我对DB设计有点生疏

首先,在
主键上不需要
唯一的
索引
主键
已经强制执行了这一点

其次,从概念上讲,您将外键添加到了错误的表中,因为概要文件应该引用用户。。这可能就是你的问题所在

我建议采用以下DDL:

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;
并将您的用户插入
用户帐户
,然后插入
配置文件

我应该强制使用外键吗


答:几乎可以肯定,它可以防止您的数据处于不一致的状态。可以添加具有已删除用户或不存在用户的配置文件。知道您的数据始终是一致的,这使得查询、显示数据和调试变得更加容易,因为不用担心这些问题。

简单地说:其他更好地支持外键的DBMS实际上可以让您通过使用可延迟的外键来解决此问题。但是我同意Arth的观点,你可能用错误的方向创建了FK约束。