代码之家  ›  专栏  ›  技术社区  ›  QB1979

添加约束,使列仅接受来自另一列的逗号分隔值

  •  0
  • QB1979  · 技术社区  · 7 年前

    我有这两张桌子:

    CREATE TABLE `car_shop` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `selling_brands` varchar(25) DEFAULT NULL,
      `some_col` varchar(25) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    
    CREATE TABLE `cars` (
      `car_id` int(11) NOT NULL AUTO_INCREMENT,
      `car_make` varchar(25) DEFAULT NULL,
      PRIMARY KEY (`car_id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
    

    第二个包含以下内容:

    +--------+----------+
    | car_id | car_make |
    +--------+----------+
    |      1 | BMW      |
    |      2 | Audi     |
    |      3 | Toyota   |
    +--------+----------+
    

    我需要添加这样一个约束,即selling\u brands列只接受汽车表中填充的值(宝马、奥迪、丰田)。

    我是这样想的:

    +----+----------------+----------+
    | id | selling_brands | some_col |
    +----+----------------+----------+
    |  1 | BMW, Audi      | shop 1   |
    |  2 | Toyota         | shop 2   |
    +----+----------------+----------+
    

    我试图添加如下约束,但不起作用:

    ALTER TABLE car_shop
    ADD FOREIGN KEY (selling_brands) 
    REFERENCES cars(car_make)
    

    我得到: 错误:(conn:24)无法添加外键约束 错误代码:1215

    1 回复  |  直到 7 年前
        1
  •  1
  •   Uueerdo    7 年前

    将逗号分隔的值或任何类型的列表放入数据库几乎总是一个坏主意。通常,当你认为你需要一个“列表”时,你真正需要的是另一张表;在您的情况下:

    cars
    - car_id
    - info about the car
    
    shops
    - shop_id
    - info about the shop
    
    car_shop
    - car_id
    - shop_id
    

    如果一家商店“拥有”多辆车,则car\u shop中的多行将引用其shop\u id。如果一辆车位于多家商店中,则car\u shop中的多行将具有其car\u id。 car_shop 也可用于包含数量、价格等信息。。。