SQL 架构级别约束
SQL Schema Level Constraint
我试图实现的一些表之间存在约束,我想我应该在数据库级别上进行,但我正在努力想出正确的术语 google,也许你们能帮上忙!
如果我有表格:
- 产品[可乐、香蕉、巧克力等]
- ProductType [食品、饮料、化妆品等]
- 位置[冰箱、架子、橱柜等]
如果->是多对一,>-<是多对多
- 产品 -> 产品类型
- 产品 -> 位置
- 产品类型 >-< 位置
给定一个冰箱,我们知道冰箱可以装[food,drink],所以在应用层面,我们只向用户展示要分配给冰箱的食品和饮料产品。有没有办法在数据库级别确保冰箱只包含其允许类型的产品?
下面是我为上述内容编写的 SQL 代码,在最后一部分我插入 'coke',ProductType 'drink'。我如何确保它不能放在 'cupboard'
中
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);
Product
中的另一个约束:
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_has_Location
table 中的内容一致。
我试图实现的一些表之间存在约束,我想我应该在数据库级别上进行,但我正在努力想出正确的术语 google,也许你们能帮上忙! 如果我有表格:
- 产品[可乐、香蕉、巧克力等]
- ProductType [食品、饮料、化妆品等]
- 位置[冰箱、架子、橱柜等]
如果->是多对一,>-<是多对多
- 产品 -> 产品类型
- 产品 -> 位置
- 产品类型 >-< 位置
给定一个冰箱,我们知道冰箱可以装[food,drink],所以在应用层面,我们只向用户展示要分配给冰箱的食品和饮料产品。有没有办法在数据库级别确保冰箱只包含其允许类型的产品?
下面是我为上述内容编写的 SQL 代码,在最后一部分我插入 'coke',ProductType 'drink'。我如何确保它不能放在 'cupboard'
中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);
Product
中的另一个约束:
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_has_Location
table 中的内容一致。