【问题标题】:Data truncated for column 'SubordinateID' at row 1第 1 行的“SubordinateID”列的数据被截断
【发布时间】:2021-03-14 15:20:10
【问题描述】:

我有一张Employees 表和一张Manages 表。在我的表 Manages 中,我有 ManagerID 和 SubordinateID,它们共同构成一个主键。 ManagerID 和 SubordinateID 都是引用 EmployeeID 的外键。如何编写代码来实现经理管理的所有员工 ID。

例如,员工 ID 为 1 的经理 1 管理员工 ID 为 2、4、5 和 13 的员工。 我尝试按如下方式执行此操作

INSERT INTO `Manages` (`ManagerID`, `SubordinateID`) VALUES ('1', '2,4,5,13');
INSERT INTO `Manages` (`ManagerID`, `SubordinateID`) VALUES ('2', '6,10,5');
INSERT INTO `Manages` (`ManagerID`, `SubordinateID`) VALUES ('4', '10,5,7');
INSERT INTO `Manages` (`ManagerID`, `SubordinateID`) VALUES ('3', '7,8,9');
INSERT INTO `Manages` (`ManagerID`, `SubordinateID`) VALUES ('11', '12');

怎么了?我收到以下错误:

ERROR 1265: 1265: Data truncated for column 'SubordinateID' at row 1
SQL Statement:
INSERT INTO `group22`.`Manages` (`ManagerID`, `SubordinateID`) VALUES ('1', '2,4,5,13')

【问题讨论】:

  • 永远不要将数据存储为逗号分隔的项目!只会给你带来很多麻烦。
  • 但是应该如何正确存放呢?
  • 每个 ManagerID/SubordinateID 组合一行。 IE。 (1,2), (1,4), (1,5), (1,13)

标签: mysql sql workbench


【解决方案1】:

我认为这是因为逗号是 sql 中的特殊字符,我希望您可以将其转义。但最好的方法是改变员工和经理之间的关系。在这里,我根据您的需要描述一些情况:

I) 一对多

如果您的员工仅由一位经理管理,您可以创建OneToMany 关系。所以每个员工都会有一个manager_id 字段,这是与经理相关的外键。

II) 递归 OneToMany

如果你没有任何 Managers 表,Employees 引用它自己

III) 多对多

如果您的员工可以由 1 个或多个经理管理,您应该实现 ManyToMany 关系。您需要第三张表,并且您需要使用 2 个外键(一个用于经理,一个用于员工)来存储经理/员工的每个组合。

IV) 递归多对多

如果您只有一个Employees 表,只需创建两个引用同一个表的外键字段。毕竟经理也是员工。

【讨论】:

    【解决方案2】:

    Manages 看起来像是一张表,每个经理和下属都有一行。

    您需要分别插入每一行。所以,而不是:

    INSERT INTO `Manages` (`ManagerID`, `SubordinateID`)
        VALUES ('1', '2,4,5,13');
    

    你会使用:

    INSERT INTO `Manages` (`ManagerID`, `SubordinateID`)
        VALUES (1, 2), (1, 4), (1, 5), (1, 13);
    

    另外,不要对数字常量使用单引号。它们表明该值是一个字符串。

    【讨论】:

      猜你喜欢
      • 2014-01-09
      • 1970-01-01
      • 2013-12-24
      • 2019-11-18
      • 2021-08-19
      • 2013-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多