数据库设置主键的时候用,为什么设置自动增长

数据库设置主键的时候用,为什么设置自动增长,第1张

保证程序的正确性,主键ID首先具有唯一性,设置自动增长在前台Insert的时候不需要传入ID的值,数据库自动根据最后一个ID值增加1

保证数据库主键不重复而且调用更为高效。

假如说没有设置自动增长

在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。搜索关键字由索引列组成,存储的值是匹配行的主键。通过二级索引进行搜索通常会导致主键的隐式搜索。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9889829.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存