【问题标题】:foreign key in mysql workbenchmysql工作台中的外键
【发布时间】:2023-12-03 04:38:02
【问题描述】:

我是 mysql 的初学者,有一个简单的问题。 我的架构(书店)中有三个表。我想在他们之间建立关系。 我的表:books(book_id,book_name,book_entity),customer(customer_id,customer_name),orders(book_id,customer_id,quantity)。 我在订单表中设置外键如下:

外键名(book_id 和 customer_id),参考表( '书店','书籍' '书店','顾客')

起初我填写了书籍表,但是当我尝试在客户表中插入数据时出现以下错误:

  ERROR 1452: Cannot add or update a child row: a foreign key constraint fails (`bookshop`.`customer`, CONSTRAINT `customer_id` FOREIGN KEY (`customer_id`) REFERENCES `order` (`customer_id`) ON DELETE NO ACTION ON UPDATE NO ACTION)

SQL Statement:

INSERT INTO `bookshop`.`customer` (`customer_id`, `customer_name`, `customer_address`) VALUES (2, 'helen', 'newyork')

我该怎么办?

我的代码:


-- Table `bookshop`.`books`

-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `bookshop`.`books` (

  `book_id` INT NOT NULL ,

  `book_name` VARCHAR(45) NOT NULL ,

  `book_price` DECIMAL NOT NULL ,

  `book_entity` INT NOT NULL ,

  PRIMARY KEY (`book_id`) )

ENGINE = InnoDB;





-- -----------------------------------------------------

-- Table `bookshop`.`customer`

-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `bookshop`.`customer` (

  `customer_id` INT NOT NULL ,

  `customer_name` VARCHAR(45) NOT NULL ,

  `customer_address` VARCHAR(45) NOT NULL ,

  PRIMARY KEY (`customer_id`) )

ENGINE = InnoDB;





-- -----------------------------------------------------

-- Table `bookshop`.`orders`

-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `bookshop`.`orders` (

  `book_id` INT NOT NULL ,

  `customer_id` INT NOT NULL ,

  `quantity` INT NOT NULL ,

  INDEX `book_id` (`book_id` ASC) ,

  INDEX `customer_id` (`customer_id` ASC) ,

  CONSTRAINT `book_id`

    FOREIGN KEY (`book_id` )

    REFERENCES `bookshop`.`books` (`book_id` )

    ON DELETE NO ACTION

    ON UPDATE NO ACTION,

  CONSTRAINT `customer_id`

    FOREIGN KEY (`customer_id` )

    REFERENCES `bookshop`.`customer` (`customer_id` )

    ON DELETE RESTRICT

    ON UPDATE RESTRICT)

ENGINE = InnoDB;

【问题讨论】:

  • 这是因为您在主表中没有对应的customer_id,而您以customer_id 作为主键。
  • 外键名引用表 book_id 'bookshop','books' customer_id 'bookshop','customer' 没有多大意义。重写你是如何定义 goreign 键的。
  • 我只想在我的表之间建立关系。外键:我的订单表中的 customer_id 和 book_id。(它们也是主要的)

标签: mysql mysql-workbench


【解决方案1】:

您的外键语句似乎已关闭,请提供您用于创建外键的语句。

但是,您似乎创建了一个外键,仅当客户的订单存在时才允许您插入客户。 你可能想反过来做。

【讨论】:

  • 我使用工作台并在数据建模中设置订单表的外键。
  • 您提供的代码看起来没问题,我猜您可能还有其他外键在玩什么?您可能需要仔细检查是否没有定义其他约束,尤其是错误状态的 customer.customer_id 上的约束
  • 谢谢蒂姆,我的问题解决了。我重置了订单表中的主键。我是初学者,在 mysql 中犯了疯狂的错误。
【解决方案2】:

发生错误的原因是因为integrity constraints。 问题是您试图添加一个引用无效的数据集。这主要是因为外键指向一个不存在的主键。在您的情况下,这可能是因为您正在添加一个客户,而客户不知何故有一个无效的参考。 你可能把关系搞混了。 如果没有关于你们关系的更多信息,这只是猜测。

【讨论】:

    最近更新 更多