保证数据库主键不重复而且调用更为高效。
假如说没有设置自动增长
在insert一条记录的时候需要人为传递ID值。要保证唯一性必须要先获得上条记录的ID用select
然后再加一
然后在执行insert
从效率方面降低程序的灵活性。
个人见解。
SQL Server 导入的时候,有开关可以设定的。就是通过 SQL 的 INSERT 导入前
先
-- 允许将显式值插入表的标识列中
SET IDENTITY_INSERT 表 ON
然后
INSERT INTO 表 ...
导入完毕以后
--不允许将显式值插入表的标识列中
SET IDENTITY_INSERT 表 OFF
相关的例子,可参考:
http://hi.baidu.com/wangzhiqing999/blog/item/18a6ecddb83405fc39012fcc.html
更省事的方式,还可以通过导入的时候,设置参数开关来处理
对于 BCP 使用 -E 的开关
对于 BULK INSERT 使用 KEEPIDENTITY 参数
对于 INSERT ...SELECT * FROM OPENROWSET(BULK...) 使用 KEEPIDENTITY 表提示
这样,自增列的数据,将暂时从数据文件中获取,而不是由数据库自增。
-----
假如坚决不用数据库的自增特性的话,那么你可以参考 Java 中的 Hibernate 的一种处理机制。
就是额外创建一张表,2个字段, 表名 与 当前序列号。
每次插入数据的时候,最新的序列号,将存储在那张额外的表里面。
但是这种处理方式,需要在客户端作一定的同步+缓冲处理。
因为这个序列号,完全由客户端产生了。
如果你的系统是 Web 的,倒问题不大,服务器那里缓冲一下就好。可以一次预读一定量的编号,用完了再去更新序号表。
如果是 Client / Server 的,那就有点麻烦了, 每个客户端插入数据的时候,都要先读/写那个序号表一次,还要确保此处理是同步的。
InnoDB 被称为索引组织型的存储引擎。主键使用的 B-Tree 来存储数据,即表行。这意味着 InnoDB 必须使用主键。如果表没有主键,InnoDB 会向表中添加一个隐藏的自动递增的 6 字节计数器,并使用该隐藏计数器作为主键。InnoDB 的隐藏主键存在一些问题。您应该始终在表上定义显式主键,并通过主键值访问所有 InnoDB 行。InnoDB 的二级索引也是一个B-Tree。搜索关键字由索引列组成,存储的值是匹配行的主键。通过二级索引进行搜索通常会导致主键的隐式搜索。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)