【问题标题】:How to insert data when we have Relationship constraints in MySQL database当我们在 MySQL 数据库中有关系约束时如何插入数据
【发布时间】:2015-09-24 11:53:47
【问题描述】:

我正在关注这个book 我的数据库类。该数据库有 6 个表。从其中的 6 个中,我将发布其中的两个表。

/*EMPLOYEE Table */
CREATE TABLE EMPLOYEE( 
    Fname VARCHAR(15) NOT NULL,
    Minit CHAR,
    Lname VARCHAR(15) NOT NULL,
    Ssn CHAR(9) NOT NULL,
    Bdate DATE,
    Address VARCHAR(30),
    Sex CHAR,
    Salary DECIMAL(10,2),
    Super_ssn CHAR(9),
    Dno INT NOT NULL,
    PRIMARY KEY (Ssn),
    FOREIGN KEY (Super_ssn) REFERENCES EMPLOYEE(Ssn)
    FOREIGN KEY (Dno) REFERENCES DEPARTMENT(Dnumber) );

Employee 表有一个递归关系来证明“一个员工是另一个员工的主管”。它还引用 DEPARTMENT 表以显示员工在部门工作。下面是 DEPARTMENT 表的架构。

CREATE TABLE DEPARTMENT( 
    Dname VARCHAR(15) NOT NULL,
    Dnumber INT NOT NULL,
    Mgr_ssn CHAR(9) NOT NULL,
    Mgr_start_date DATE,
    PRIMARY KEY (Dnumber),
    UNIQUE (Dname),
    FOREIGN KEY (Mgr_ssn) REFERENCES EMPLOYEE(Ssn) 
    );

DEPARTMENT 表引用employee 表以显示员工管理一个部门。 插入数据时如

    insert into EMPLOYEE values
    ('John','B','Smith','123456789','1965-01-09','731 Fondren, Houston, TX',
     'M',30000,'333445555',5);

我们将无法执行上述查询,因为存在引用完整性FOREIGN KEY (Super_ssn) REFERENCES EMPLOYEE(Ssn)。如果我尝试下面的查询也一样

insert into department values ('Research',5,'333445555','1988-05-22');

上面的查询不会执行,因为员工表中没有数据。我的问题是我们是否应该首先插入数据然后更改表并强制执行参照完整性约束。或者有什么办法。您的建议/建议将不胜感激。谢谢。

【问题讨论】:

  • 它不需要像放弃约束那样激烈。只允许该列为空。

标签: mysql sql database referential-integrity


【解决方案1】:

外键可以有空值。因此,您可以输入具有 null 的外键值的值,例如最上面的主管,他上面没有主管。

所以一般的想法是自下而上输入数据,比如在没有外键的表中输入值,然后在引用该表的顶部输入值,等等......

确切的方法将取决于您在示例中使用的其余表。

【讨论】:

  • 谢谢@Ankit Deshpande。我阅读的这篇文章并不真正支持具有空值的外键。只是有点迷茫。不过感谢您的回复。
  • 我同意你的看法。但是如果员工实际上没有主管会发生什么??
  • 明白你的意思@Ankit Deshpande。我允许我的外键为空。一切正常。谢谢
  • 我认为这可能会有所帮助...想象一下没有主管 ID 的部门表。并创建另一个名为 deptSupervisor 的表。 deptSupervisor 将拥有主管的 deptID 和 empID。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
  • 2021-05-04
相关资源
最近更新 更多