Mysql 使用数据库关系限制输入

Mysql 使用数据库关系限制输入,mysql,database,foreign-keys,relational-database,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 CURREN

我很难理解如何在关系数据库中限制输入。情况如下:

数据库: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,这样他们就不会说车型a是制造商C制造的,而它是制造商B制造的,并且在车型表中显示为

有没有一种方法可以通过关系做到这一点?非常确定,只是不确定如何正确设置表来防止这种情况


编辑:为了澄清,只有一个制造商可以生产一个型号。如果制造商生产相同型号的汽车,这将是一个新的项目,因为它将有不同的规格。这是一个很小的db,因为我稍后会添加specs之类的列,只是想让基本功能正常工作,并了解mysql如何使用关系来限制输入。

Car
表将
model\u id
manufacturer\u id
组合作为主键。现在,当您添加新车时,制造商id将作为
制造商
表中的外键,而
车型id
将作为
车型
表中的外键

所以不会像你说的那样发生冲突。 另外,
型号
表与
制造商
表具有多对一关系,主键为
id


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

我将从
汽车
中删除
制造商id
,因为它已经在
车型中了。如果你需要找汽车制造商,只需加入
车型
。我同意。很大程度上取决于需求。一个小的、两列的表映射一个品牌和另一个模型也是可能的。两个公司(Austin和Morris Mini)能否建立相同的模型?车型名称可能会发生冲突(Riley和Nissan Pathfinder),因此用户的搜索不应在一次匹配中停止。。