我使用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设计上有点生疏。
答案 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值。我应该强制执行外键吗?
一个。几乎可以肯定,它可以防止您的数据进入不一致的状态。可以添加具有已删除用户或不存在的用户的配置文件。了解您的数据始终保持一致使查询,显示数据和调试变得更加容易,因为不用担心。