我的SQL数据库中有两个表:
公司:
雇员:
问题在于我希望员工ID(internal_id)与他们所属的公司相关。我得到了这个困境,因为我一直在寻找实现它的最干净的方法。
一种选择就是创建一种SELECT MAX(internal_id)FROM employees WHERE company_id = X,但问题是如果我碰巧删除了最后一个员工,那么下一个员工将使用下。
有任何想法或建议吗?
PD:我想要这样做的原因是我不希望公司X的用户创建一个例如ID = 2000的员工,而在他的公司创建的最后一个员工是,比方说, 1532.这通常发生在Y和Z公司也在同一系统上创建员工的系统中。我希望这个ID不能用作foreign_key,而是用于内部(甚至文档或报告)使用。
PD2:在这种情况下,员工永远不必改变公司
答案 0 :(得分:12)
不,不要那样做!这将在您的数据库中创建许多问题(您必须担心其他事情中的并发问题)来解决不是问题并且事实上正确设计的问题。 id应该没有意义,差距也不重要。您可能希望在employeeid / companyid组合上使用唯一索引,以确保没有员工分配给多家公司。
您的员工ID应该是永远不需要更改的东西。如果您制作某种基于公司的愚蠢ID并且公司A购买公司B并成为公司C,则最终必须更改所有ID和所有相关表。在您当前的设计中,您只需要更新公司代码,而不是相关的表格。
答案 1 :(得分:4)
创建一个单独的表:
CREATE TABLE t_identity (company INT NOT NULL PRIMARY KEY, id INT NOT NULL)
并发出:
INSERT
INTO t_identity (@company, 1)
ON DUPLICATE KEY UPDATE
SET id = id + 1
在插入新员工之前。
答案 2 :(得分:3)
此处有很多关于创建与主键无关的“商家”ID或数字的问题。
在您的情况下,我将在Company表“NextEmployeeID”上创建一个列然后在创建新员工时,只需检索该值并将其递增。
现在我告诉你,如果员工改变公司会发生什么。 : - )
答案 3 :(得分:0)
您永远不应该从关系数据库中删除行。您应该使该员工到期(IE,Set Employee.ActiveFlag = 0)
所以如果你有一个internal_id(int)并且做了一个(SELECT MAX(internal_Id)+1 FROM Employees WHERE Company_Id = [parameterCompanyID])那么这样就可以了。
答案 4 :(得分:0)
如果您要将员工ID用作fk,您真的想要删除它以及他们在数据库中的所有工作吗?在员工中创建一个状态字段,并将其设置为“A”或“I”。如果EmployeeID在所有公司中保持唯一,那么最好让它自动增量。永远不要让用户看到ID,让他们只看到名字。
也不要将列ID,CompanyID或EmployeeID命名为更易读和更容易搜索。
答案 5 :(得分:0)
为什么不为您的internal_ids使用GUID?这样,您可以随时进行插入,而不必担心ID冲突。
根据你当前的结构,你将无法避免删除异常,但你真的不应该按照你提出的方式去做。为了可靠地获得“下一个数字”,你将不得不锁定表格,这将导致各种不良。也许你可以为员工实施某种软删除,因为他们往往有时会去。 :)
答案 6 :(得分:0)
我会像Quassnoi建议的那样,用公司和当前的最大序列号创建一个单独的表。但是我会将它包装在存储过程或UDF(MySQL做UDF吗?)中,它接受公司作为输入,递增当前值并返回该递增值。
答案 7 :(得分:0)
我宁愿为3个变量创建3列,并允许管理员修改数据库中的值! 1.公司简称代码(companyCode即COMP) 2.公司部门短代码(depCode即DEP) 3.公司开始计算值(compVal即00000) 现在添加新员工时,我每次都会加入所有变量和增量并更新compVal ++! (即COMP-DEP-0001) 或者我们也可以使用员工ID
添加date()