我在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(在主键中)。
我该怎么做?
希望我能理解:)
答案 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,也可以不是唯一的。