2016-06-15 46 views
1

我正在使用MySQL,尝试构建在线车辆数据库系统。为此,我创建了两个表格:车辆和车主。指向另一个表中的多行的外键

create table vehicles 
(
    v_id int AUTO_INCREMENT PRIMARY KEY, 
    v_reg_number varchar(255) unique, 
    v_engine_number varchar(255) unique, 
    v_chassis_number varchar(255) unique, 
    v_type varchar(255), 
    v_manufacturer varchar(255), 
    v_model_year varchar(255), 
    v_power varchar(255), 
    v_origin varchar(255) 
) 

create table owners 
(
    o_id int AUTO_INCREMENT PRIMARY KEY, 
    v_id int, 
    o_name varchar(255), 
    o_father_name varchar(255), 
    o_cnic varchar(255) unique, 
    o_dob varchar(255), 
    o_gender varchar(255), 
    FOREIGN KEY(v_id) REFERENCES vehicles(v_id) 
) 

所以一个车主可能会有更多的车辆以他的名义注册。我的问题是,如何将保存在owners.v_id中的多个ID参照vehicles表保存?

+0

外键必须满足单行。而且你的数据不应该让CSV数据在非规范化和多值化方面受到疯狂的干扰。退后一步,想想你想要完成的任务,而不会产生一个可怕的系统。 – Drew

回答

1

通常解决这将是创建一个交集表:

CREATE TABLE vehicles_owned 
(
    o_id INT, 
    v_id INT, 
    PRIMARY KEY (o_id, v_id), 
    FOREIGN KEY (o_id) 
    REFERENCES owners (o_id), 
    FOREIGN KEY (v_id) 
    REFERENCES vehicles (v_id) 
); 

然后,从owners下降v_id

该表格允许每个owner拥有多个vehicles,并且每个vehicle拥有多个owners。如果要强制实施每车一个车主限制,请在vehicles_owned.v_id上添加一个UNIQUE索引。

编辑:当然,如果你想执行一个车主每车限制,你也可以简单地将o_id作为外键添加到vehicles,而不用担心交叉表。

相关问题