Jef*_*eff 5 mysql database-design mysql-5.5
我现在管理一个由另一个人设计和创建的 MySQL 数据库。
我对原始开发人员创建的某个设置感到困惑。
他没有对表 ID 使用自动增量。相反,他创建了一个名为system_sequences的表 ,它有两列:
system_sequences.Table_Name
system_sequences.Next_Value
Run Code Online (Sandbox Code Playgroud)
这是一个表的示例以及它当前如何插入表中(尽我所能):
有一个名为customer的表,有一个唯一的 ID 列。
如果我想插入客户,目前我必须执行以下操作:
SELECT system_sequences.Next_Value
FROM system_sequences
WHERE system_sequences.Table_Name = 'customer'
Run Code Online (Sandbox Code Playgroud)
将 next_value 保存到变量中并将其用作客户的下一个 ID
那么我必须:
UPDATE system_sequences
SET Next_Value = Next_Value + 1
WHERE system_sequences.Table_Name = 'customer'
Run Code Online (Sandbox Code Playgroud)
我没有设计这个,我不喜欢它的任何形状或形式(我实际上讨厌它)并且我想小心地将所有内容转换为 auto_increment
但是否有原因或我不知道的好处?我以前从未见过类似的东西。并且此数据库没有任何文档可以解释任何内容。
最初的设计者可能考虑到了对数据库资源的某种快速概述。
我知道 Oracle 支持一个称为 SEQUENCE 的数据库对象,只需调用下一个值,即可使用序列对象执行 auto_increment。
你像这样创建它:
CREATE SEQUENCE eseq INCREMENT BY 1;
Run Code Online (Sandbox Code Playgroud)
第一个引用eseq.nextval
返回 1。
再次强调,只需拨打eseq.nextval
您的触发器,您每次都会得到一个安全的号码。MySQL 没有这样的东西。最初的设计者可能已经考虑到了这一点,并且鉴于 MySQL 没有像 Oracle Sequence 这样的数据库对象,因此简单地进行了模拟。
我还可以假设没有机制或基础设施来收集和重用已删除的 id,从而在 ids 中留下空白。
查看您提到的系统资源规范,您可以猜测表中有多少行而不是运行SELECT COUNT(*) FROM customers;
.
如果我必须猜测为什么这样做,我的猜测是设计者不知道或不信任 MySQL 拥有 INFORMATION_SCHEMA 数据库。MySQL 从 MySQL 5.0 开始就有 INFORMATION_SCHEMA 数据库。MySQL 5.0 之前的所有版本都没有 INFORMATION_SCHEMA 数据库。
归档时间: |
|
查看次数: |
298 次 |
最近记录: |