使用数据库关系限制输入

时间:2016-03-13 18:56:27

标签: mysql database foreign-keys relational-database

我无法限制在关系数据库中限制输入。见下面的情景:

数据库:MySQL

表1:

CREATE TABLE IF NOT EXISTS `manufacturers` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NOT NULL,
  `created_at` DATETIME NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`))
ENGINE = InnoDB

表2:

CREATE TABLE IF NOT EXISTS `models` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `manufacturer_id` INT NOT NULL,
  `name` VARCHAR(45) NOT NULL,
  `created_at` DATETIME NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`, `manufacturer_id`),
  INDEX `fk_models_manufacturers_idx` (`manufacturer_id` ASC),
  CONSTRAINT `fk_models_manufacturers`
    FOREIGN KEY (`manufacturer_id`)
    REFERENCES `manufacturers` (`id`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB

表3:

CREATE TABLE IF NOT EXISTS `cars` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `manufacturer_id` INT NOT NULL,
  `model_id` INT NOT NULL,
  `photo` TEXT NULL,
  `price` DECIMAL(6,2) NULL DEFAULT 0.00,
  `created_at` DATETIME NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`, `manufacturer_id`, `model_id`),
  INDEX `fk_cars_models1_idx` (`model_id` ASC, `manufacturer_id` ASC),
  CONSTRAINT `fk_cars_models1`
    FOREIGN KEY (`model_id` , `manufacturer_id`)
    REFERENCES `models` (`id` , `manufacturer_id`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB

我正在用PHP编写一个应用程序,有人可以在他们的数据库中添加汽车。如您所见,汽车的型号和制造商与型号表相关联,以保持车型与车型和制造商的联系。 我怎样才能确保当有人添加汽车时,他们不会混淆型号和制造商ID,所以他们不会说制造商C制造的A型是由制造商B制造的,并且它在型号表中说明。

有没有办法用关系做到这一点?很确定如何正确设置表格以防止这种情况。

编辑:澄清一下,只有一家制造商可以生产一种型号。如果制造商制造具有相同型号名称的汽车,则它将是新的条目,因为它具有不同的规格。这是一个小型数据库,因为我将在后面添加类似规范的列,只是尝试使基本功能正常工作并了解mysql如何使用关系来限制输入。

1 个答案:

答案 0 :(得分:0)

Car表格中包含model_idmanufacturer_id的组合作为主键。现在,当您添加新车时,manufacturer_id将充当manufacturer表中的外键,model_id将充当model表中的外键。

因此,如你所说,不会发生任何冲突。 此外,model表与manufacturer表具有多对一关系,主键为id

这是一个非常开放的问题,您可以找到其他设计数据库的方法,它实际上取决于您的需求以及您希望如何投影系统。