Mysql SQL模式级约束

Mysql SQL模式级约束,mysql,sql,constraints,Mysql,Sql,Constraints,我试图实现的一些表之间有一个约束,我想我应该在db级别上实现它,但我正在努力为google找到合适的术语,也许你们可以帮助我! 如果我有表格: 产品[可乐、香蕉、巧克力等] 产品类型[食品、饮料、化妆品等] 位置[冰箱、架子、橱柜等] 如果->是多对一,而>-产品类型 产品->位置 ProductType>-

我试图实现的一些表之间有一个约束,我想我应该在db级别上实现它,但我正在努力为google找到合适的术语,也许你们可以帮助我! 如果我有表格:

  • 产品[可乐、香蕉、巧克力等]
  • 产品类型[食品、饮料、化妆品等]
  • 位置[冰箱、架子、橱柜等]
如果->是多对一,而>-<是多对多

  • 产品->产品类型
  • 产品->位置
  • ProductType>-<位置
给定一台冰箱,我们知道冰箱可以包含[食品、饮料],因此在应用程序级别上,我们只向用户提供分配给冰箱的食品和饮料产品。在db级别上是否有办法确保冰箱只包含其允许类型的产品

下面是我为上述内容编写的SQL代码,在最后一部分中,我插入了“coke”和ProductType“drink”。如何确保它不会被放在“橱柜”中

CREATE SCHEMA IF NOT EXISTS `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `test` ;

-- -----------------------------------------------------
-- Table `test`.`Location`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test`.`Location` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `test`.`ProductType`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test`.`ProductType` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `test`.`Product`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test`.`Product` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NULL,
  `Location_id` INT NULL,
  `ProductType_id` INT NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `fk_Product_Location_idx` (`Location_id` ASC),
  INDEX `fk_Product_ProductType1_idx` (`ProductType_id` ASC),
  CONSTRAINT `fk_Product_Location`
    FOREIGN KEY (`Location_id`)
    REFERENCES `test`.`Location` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_Product_ProductType1`
    FOREIGN KEY (`ProductType_id`)
    REFERENCES `test`.`ProductType` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `test`.`ProductType_has_Location`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test`.`ProductType_has_Location` (
  `ProductType_id` INT NOT NULL,
  `Location_id` INT NOT NULL,
  PRIMARY KEY (`ProductType_id`, `Location_id`),
  INDEX `fk_ProductType_has_Location_Location1_idx` (`Location_id` ASC),
  INDEX `fk_ProductType_has_Location_ProductType1_idx` (`ProductType_id` ASC),
  CONSTRAINT `fk_ProductType_has_Location_ProductType1`
    FOREIGN KEY (`ProductType_id`)
    REFERENCES `test`.`ProductType` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_ProductType_has_Location_Location1`
    FOREIGN KEY (`Location_id`)
    REFERENCES `test`.`Location` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

INSERT INTO `test`.`Location`
(`name`)
VALUES
('fridge'),('shelf'),('cupboard');

INSERT INTO `test`.`ProductType`
(`name`)
VALUES
('food'),('drink'),('cosmetics');

INSERT INTO `test`.`ProductType_has_Location`
(`ProductType_id`,`Location_id`)
VALUES
(1,1),(2,1),(2,2),(3,3);

INSERT INTO `test`.`Product`
(`name`,`ProductType_id`,`Location_id`)
VALUES
('coke',2,NULL);

产品中的另一个约束条件是:

CONSTRAINT `fk_Product_Location_XRef`
FOREIGN KEY (`ProductType_id`,`Location_id`)
REFERENCES `test`.`ProductType_has_Location` (`ProductType_id`,`Location_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION

然后检查类型和位置是否与
ProductType\u has\u Location
表中的内容一致。

Aha,因此它有效地将
(ProductType\u id,Location\u id)
视为唯一元组?@leontrolski-您已在
ProductType\u has\u Location
表中声明了它们是唯一的-此处为
主键(`ProductType\u id`、`Location\u id`)