在关联表中插入空值

时间:2015-06-18 09:33:33

标签: sql

我在SQL中遇到问题,让我们看一下数据库的例子:

CREATE TABLE person( //Employee
     pe_id PRIMARY KEY  NOT NULL AUTO_INCREMENT,
     pe_name VARCHAR(20),
     pe_office VARCHAR(20)
); 

CREATE TABLE project( //Mission
     pr_id PRIMARY KEY  NOT NULL AUTO_INCREMENT,
     pr_name VARCHAR(20),
     pr_status VARCHAR(15)
);

CREATE TABLE techno( //Programming language
     te_id PRIMARY KEY  NOT NULL AUTO_INCREMENT,
     te_name VARCHAR(20)
);

CREATE TABLE job( //developer, manager, ...
     jo_id PRIMARY KEY  NOT NULL AUTO_INCREMENT,
     jo_name VARCHAR(20)
);

我想使用technos为项目工作人员分配工作。 例如,Rob使用AngularJS和HTML作为项目#13的开发人员和项目经理。

所以我创建了这个表:

CREATE TABLE assignment(
    pe_id INT,
    pr_id INT,
    te_id INT,
    jo_id INT,
    as_days INT, //Days of work
    PRIMARY KEY(pe_id, pr_id, tr_id, jo_id),
    CONSTRAINT fk_as_pe_id FOREIGN KEY(pe_id) REFERENCES person(pe_id),
    CONSTRAINT fk_as_pr_id FOREIGN KEY(pr_id) REFERENCES project(pr_id),
    CONSTRAINT fk_as_te_id FOREIGN KEY(te_id) REFERENCES techno(te_id),
    CONSTRAINT fk_as_jo_id FOREIGN KEY(jo_id) REFERENCES job(jo_id)
);

我希望有能力将开发人员的某些技术分配给项目而不知道是谁,例如:

INSERT INTO assignment(pr_id,te_id,jo_id,as_days) VALUES(1,2,3,4); //No person!

我们假设这些值存在于项目,技术和工作表中。

但似乎我不能插入这个,可能是因为我没有定义人的ID(在主键中)。

我该怎么做?

希望我能理解:)

3 个答案:

答案 0 :(得分:0)

也许你应该这样做:

在插入禁用约束之前:

ALTER INDEX fk_as_pe_id ON assignment
DISABLE;

插入后启用它:

ALTER INDEX fk_as_pe_id ON assignment
REBUILD;

答案 1 :(得分:0)

另一种替代方法是,如果可以更改表结构,只需从赋值表中的复合主键中排除pe_id

答案 2 :(得分:0)

您可以通过不将其作为主键来解决此问题。主键不能为NULL,或者如果它们是复合主键,则不能包含NULL。 将其设为唯一索引。为主键创建自动编号字段。我认为这是你案例中更好的解决方案

  • 主键:

表中只能有一个

它永远不允许空值

主键是唯一键标识符,不能为空且必须是唯一的。

  • 唯一钥匙:

一个表中可以有多个唯一键。

唯一键可以具有空值(仅允许单个null)。

它可以是候选键

唯一键可以为null,也可以不是唯一的。