一个小程序,最初采用了 SqlServer 数据库,后来为了便于部署,转而采用了 Firebird 嵌入式数据库。在重构代码转到 Firebird 的过程中,对“数据实体的数据表的ID字段是否应该使用自增长字段”这个问题做了一些思考,在此做一些总结。

对于是否应该使用自增长的ID字段的问题,个人的观点是应该根据自己的项目情况考虑,谨慎使用。要“谨慎”是因为这有可能会带来一些意想不到的问题:

  • 不利于程序在扩展到对其它类型数据库的支持。因为不同类型的数据库实现自增长的方式不一样,其产生和获取自增长ID值的SQL语法也不同,这给程序的数据访问层的数据库支持的扩展会带来额外的工作量。例如,在 SqlServer 中,自增长(Identity)是列的属性,在插入一行后,可以通过 @@IDENTITY 变量、SCOPE_IDENTITY 和 IDENT_CURRENT 函数获得新分配的ID值(注:这三种方式有区别),SQL语句如:INSERT INTO Table1 (field1, field2) VALUES (v1, v2) SELECT SCOPE_IDENTITY() 。但在 Oracle 中得开发者通过创建“序列”并结合“触发器”实现自增长,其插入后获取ID的语句则完全不同。其它的数据库,如DB2的类似于SqlServer,Firebird 的自增长方式与 Oracle 的类似,但总之没有哪两个数据库的自增长是相同的,实现以及语法都不同。
  • 对含有数据库自增长的ID字段加入外键关系的数据表的数据进行直接进行导入导出时会导致关系的丢失。例如有两个表:School {ID, Name}; Student {ID, SchoolID, Name}; 建立外键关系 Student.SchoolID -> School.ID 。那么,当将学校和学生数据同时导入这两个表时就会遇到麻烦,因为 School.ID 的值是新的序列值,不一定可预测,这就会导致 Student 数据中保持的 SchoolID 与对应的School数据在表中的新的ID不一致。
  • 便于使用中获取id的值

所以,应根据项目的实际情况是否有可能存在以上问题的场景,如果有,采用数据库自增长字段是得不偿失的,带来的初期便利和稍微的性能提升弥补不了后期增加的额外维护成本。如果项目本身不会有多数据库的支持,不会在自增长的 ID 上建立和维护关系,那么使用自增长还是可以的。

  原文地址:https://www.cnblogs.com/haiq/articles/1751778.html

ID字段不采用数据库自增长的几点理由的更多相关文章

  1. php大力力 [020节]mysql数据库唯一id字段如何设置

    2015-08-26 php大力力020.mysql数据库唯一id字段如何设置 不懂 以下有些文章 mysql唯一id 自动生成 uuid mysql 里面可以用uuid()语句来生成一个UUID:s ...

  2. mysql数据库单表只有一个主键自增id字段,ibatis实现id自增

    mysql数据库单表只有一个主键自增id字段,ibatis实现id自增 <insert id="autoid">        insert into user_id ...

  3. Sql Server数据库自增长字段标识列的插入或更新修改操作办法

    写在前面的话:在日常的Sql server开发中,经常会用到Identity类型的标识列作为一个表结构的自增长编号.比如文章编号.记录编号等等.自增长的标识很大程度上方便了数据库程序的开发,但有时候这 ...

  4. Oracle 实现表中id字段自增长

    Oracle 实现表中id字段自增长 最近正在学习Oracle的时候发现Oracle表中的字段不能像mysql中那样可以用auto increment修饰字段从而让id这种主键字段实现自增长. 那Or ...

  5. Android在API推荐的方式来实现SQLite数据库的增长、删除、变化、检查操作

    package com.examp.use_SQLite.dao; import java.util.ArrayList; import java.util.List; import android. ...

  6. Asp.net Identity 系列之 怎样修改Microsoft.AspNet.Identity.EntityFramework.IdentityUser 的 Id 字段的数据类型

    这篇博客我们来学习如何将AspNetUsers 表的Id 字段 的类型由nvarchar(128) 改为Int 并且子增长 1.为什么要修改 如果你运行过 Asp.net mvc 示例项目,你好会发现 ...

  7. SQLServer数据库自增长标识列的更新修改操作

    SQLServer数据库自增长标识列的更新修改操作方法在日常的sql server开发中,经常会用到Identity类型的标识列作为一个表结构的自增长编号.比如文章编号.记录序号等等.自增长的标识列的 ...

  8. 写一个根据id字段查找记录的缓存函数(javascript)

    前不久在参加面试的时候遇到了这样一道题,"写一个根据id字段查找记录的缓存函数,如果之前查过,则直接返回之前查找过的对象,而无须重新查找".当时由于时间较短加上时间比较紧张,考虑并 ...

  9. Spring Cloud Config采用数据库存储配置内容

    在之前的<Spring Cloud构建微服务架构:分布式配置中心>一文中,我们介绍的Spring Cloud Server配置中心采用了Git的方式进行配置信息存储.这一设计巧妙的利用Gi ...

随机推荐

  1. python pep8 命令规范

    命名规范:总体原则,新编代码必须按下面命名风格进行,现有库的编码尽量保持风格.1 尽量单独使用小写字母‘l’,大写字母‘O’等容易混淆的字母.2 模块命名尽量短小,使用全部小写的方式,可以使用下划线. ...

  2. bzoj 3528 [Zjoi2014]星系调查【树链剖分+数学】

    参考:https://www.cnblogs.com/zhuohan123/p/3698852.html 首先,根据点到直线距离公式 \[ d=\frac{kx_0-y_0+b}{\sqrt{k^{2 ...

  3. 第五篇(那些JAVA程序BUG中的常见单词)

    The left-hand side of an assignment must be a variable 赋值的左侧必须是变量 left-hand side 左边 assignment 赋值

  4. poj 2083 Fractal 递归 图形打印

    题目链接: http://poj.org/problem?id=2083 题目描述: n = 1时,图形b[1]是X n = 2时,图形b[2]是X  X        X               ...

  5. 洛谷 P3804 【模板】后缀自动机

    来一份模板 #include<cstdio> #include<algorithm> #include<cstring> #include<queue> ...

  6. java的构造方法 this 重载

    this1.隐含的局部变量在方法中指向调用该方法的对象()使用:当成员变量与局部变量同名的时候,通过this说明哪一个是成员变量.(this指向的是成员变量) 2.作为当前类的构造方法名存在作用:在构 ...

  7. Matlab实现Butterworth滤波器 分类: 图像处理 2014-06-02 00:05 527人阅读 评论(0) 收藏

    下面是用Matlab实现的Butterworth高通.低通滤波器. clc;clear all;close all; I=imread('cameraman.tif'); subplot(3,2,1) ...

  8. 奇葩问题: lsattr -d /data 显示:----------I--e- /data/

    奇葩问题 lsattr -d /data 显示:----------I--e- /data/ 问题影响: 其他权限中I(大写i) 目录下不能删除文件,不能添加文件 ================== ...

  9. ADO.net增删改的使用

    添加数据 -------------------------------------------------- //让用户输入要添加的内容 Console.WriteLine("请输入要添加 ...

  10. if判断的时候明明是null却不走null的函数体?

    String phoneStr = String.valueOf(parmMap.get(phone.trim())); if(StringUtils.isBlank(phoneStr) || &qu ...