我现在管理一个由另一个人设计和创建的 MySQL 数据库。
我对原始开发人员创建的某个设置感到困惑。
他没有对表 ID 使用自动增量。相反,他创建了一个名为 system_sequences的表,其中有两列:
system_sequences.Table_Name
system_sequences.Next_Value
这是一个表的示例以及它当前如何插入表中(尽力而为):
有一个名为customer的表,它有一个唯一的 ID 列。
如果我想插入客户,目前我必须执行以下操作:
SELECT system_sequences.Next_Value
FROM system_sequences
WHERE system_sequences.Table_Name = 'customer'
将 next_value 保存到变量中并将其用作客户的下一个 ID
然后我必须:
UPDATE system_sequences
SET Next_Value = Next_Value + 1
WHERE system_sequences.Table_Name = 'customer'
我没有设计这个,我不喜欢它的任何形状或形式(我实际上讨厌它)并且我想小心地将所有内容转换为 auto_increment
但是有没有我不知道的原因或好处?我以前从未见过这样的东西。而且这个数据库没有任何文档可以解释任何内容。
我不知道 mysql,但在 SQL Server 中,当你无法承受回滚序列中的间隙时,你会使用这种类型的东西。这通常是会计审计对发票编号的要求。
最初的设计者可能对数据库资源有某种过度的快速概览。
我知道 Oracle 支持一个称为 SEQUENCE 的数据库对象,通过调用下一个值,auto_increment 是用序列对象执行的。
你这样创建它:
对的第一个引用
eseq.nextval
返回 1。同样,只需调用
eseq.nextval
您的触发器,您就可以确保每次都使用一个安全的号码。MySQL 没有这样的东西。最初的设计者可能已经考虑到这一点,并根据 MySQL 没有像 Oracle Sequence 这样的数据库对象来简单地模拟它。我还可以假设没有机制或基础设施来收集和重用已删除的 ID,从而在 ID 中留下空白。
查看您提到的系统资源规范,您可以猜测 table 中有多少行而不是 running
SELECT COUNT(*) FROM customers;
。如果我不得不猜测为什么这样做,我的猜测是设计者不知道或不相信 MySQL 有一个 INFORMATION_SCHEMA 数据库。MySQL 从 MySQL 5.0 开始就有了 INFORMATION_SCHEMA 数据库。MySQL 5.0 之前的所有版本都没有 INFORMATION_SCHEMA 数据库。