【问题标题】:Insert statement conflict with foreign key constraint插入语句与外键约束冲突
【发布时间】:2018-04-25 21:44:17
【问题描述】:

我正在编写练习脚本,以下是 emp 和部门表:

Create table Employee
(
EmpId       int,
Name        varchar(30),
Designation varchar(50),
DateOfBirth date,
Salary      int,
Department  int,
Gender      char(2),
Primary key(empId),
    foreign key(empId) references Department(DeptId)
)
Create table Department
(
DeptId      int,
Department  varchar(30),
Primary key(DeptId)
)

当我在 Employee 表中插入行时,我收到以下错误:

消息 547,第 16 级,状态 0,第 2 行 INSERT 语句与 FOREIGN KEY 约束“FK_Employee_EmpId”冲突。冲突发生在数据库“Ramandeep”、表“dbo.Department”、列“DeptId”中。 该语句已终止。

下面是我要插入的行:

 Insert into Employee(EmpId,Name,Designation,DateOfBirth,Salary,Department,Gender) values (4,'Sam','Accountant','1973-05-13',6500,4,'M')

并且值在部门表中可用

Insert into Department(DeptId,Department) values (1,'HR')
Insert into Department(DeptId,Department) values (2,'Operation')
Insert into Department(DeptId,Department) values (3,'IT')
Insert into Department(DeptId,Department) values (4,'Admin')

我不知道为什么会收到此错误。请帮忙解决。

【问题讨论】:

  • 我认为你的设计是错误的。为什么要将作为该表的主键的 Employee.EmpId 设置为 Department 表的外键约束?这没有任何意义
  • 设计确实看起来不对,但实际上并没有抛出错误。
  • @JayasuryaSatheesh 我在这里做错了什么,你能解释一下吗?
  • 为什么要设置与主键和外键相同的 co.umn?根据设计,这意味着每个部门只能有 1 名员工。所以我建议你应该改变设计,在Employee表中添加一个新的Column来存储Department Id并将其设置为外键,而不是在EmpId列本身中设置外键
  • 现在我明白了,我做错了,我必须将 Department 作为外键而不是 EmpId。感谢您指出问题

标签: mysql sql-server database tsql


【解决方案1】:

设计看起来确实有问题,但实际上并没有引发错误。也许你没有按正确的顺序做事

MariaDB [sandbox]> drop table if exists e;
Query OK, 0 rows affected (0.23 sec)

MariaDB [sandbox]> drop table if exists d;
Query OK, 0 rows affected (0.19 sec)

MariaDB [sandbox]> Create table D
    -> (
    -> DeptId      int,
    -> Department  varchar(30),
    -> Primary key(DeptId)
    -> );
Query OK, 0 rows affected (0.20 sec)

MariaDB [sandbox]>
MariaDB [sandbox]>
MariaDB [sandbox]> Create table E
    -> (
    -> EmpId       int,
    -> Name        varchar(30),
    -> Designation varchar(50),
    -> DateOfBirth date,
    -> Salary      int,
    -> Department  int,
    -> Gender      char(2),
    -> Primary key(empId),
    ->     foreign key(empId) references D(DeptId)
    -> )
    -> ;
Query OK, 0 rows affected (0.22 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> Insert into D(DeptId,Department) values (1,'HR');
Query OK, 1 row affected (0.03 sec)

MariaDB [sandbox]> Insert into D(DeptId,Department) values (2,'Operation');
Query OK, 1 row affected (0.02 sec)

MariaDB [sandbox]> Insert into D(DeptId,Department) values (3,'IT');
Query OK, 1 row affected (0.04 sec)

MariaDB [sandbox]> Insert into D(DeptId,Department) values (4,'Admin');
Query OK, 1 row affected (0.03 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> Insert into E(EmpId,Name,Designation,DateOfBirth,Salary,Department,Gender)
    -> values
    -> (4,'Sam','Accountant','1973-05-13',6500,4,'M');
Query OK, 1 row affected (0.04 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> select * from e;
+-------+------+-------------+-------------+--------+------------+--------+
| EmpId | Name | Designation | DateOfBirth | Salary | Department | Gender |
+-------+------+-------------+-------------+--------+------------+--------+
|     4 | Sam  | Accountant  | 1973-05-13  |   6500 |          4 | M      |
+-------+------+-------------+-------------+--------+------------+--------+
1 row in set (0.00 sec)

【讨论】:

  • 我在代码中做错了什么我认为你尝试的相同
  • 完全一样(除了为了保护我的数据库而更改的表名),我发布了答案以证明代码没有问题。我只能建议部门表在插入员工时不包含 4 的 deptid,或者您显示的插入员工时不会出现错误。
  • 但是我复制了您的代码并将其粘贴到 SSMS 并执行它,但我仍然收到相同的错误。我不知道为什么
  • 在 sqlserver 中也适用于我。
  • 是的,我做错了,实际上我必须将 Department 作为外键而不是 EmpID。现在我将部门设为外键并执行脚本,然后它就可以正常工作了。感谢兄弟的帮助
【解决方案2】:

此错误似乎是试图在外部表中不存在的外键列中插入具有值的记录。

如果您的部门表有可用的值,请检查事务是否已在数据库中提交。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多