`
jbf034
  • 浏览: 153147 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

主键与ID

阅读更多
你可能已经注意到了我们的例子数据库内的所有表都定义有一个整数列叫id,做为表的
主键。这是Active Record 的约定。
“请等等!”你喊道。“我的order 表的主键应该是定单号或一些意义的列?为什么使
用一个没有意义的主键,比如id?”
原因是实践—外部数据的格式可能随着时间而更改。例如,你可能想一本书的ISBN 应该
是books 表的最好主键。毕竟,ISBN 是唯一的。但是像现在写的这本书,美国的发行行业做
了修改,给所有的ISBN 一个额外的数字。
如果我们已使用ISBN 做books 表的主键,我们必须更改每一行以反映这种改变。但是会
有另一个问题。数据库内所有的通过books 表的主键引用它的其它表呢。我们不能修改books
表内这些键,除非我们先遍历它,然后更新所有这些引用。而且这还包括使用的外键约束,
更新表,更新books 表,最后重建约束。所有这些,是多大的痛苦。
如果我们使用我们自己的内部值做为主键,则事情会工作的更好。没有第三方跟着,也
不会武断的要求我们修改什么—我们控制我们自己的键空间。如果有些事如ISBN 需要修改,
它的修改不会影响到数据库内任何其它现有的关联。实际小,我们已经将这些行内数据的外
部表示与行的关系减到了最小。
现在,没有什么理由说我们不能给我们的终用户使用id 值了。在order 表内,我们可以
称它为一定单的id,并在所有工作簿上打印它。但是做这些事要小心—在任何时候一些调整
可能发生并要求定单的id 必须遵循一个外部施加的格式,并且你要返回你开始的地方。
如果你给一个Rails 应用程序创建了一个新schema,你或许想与工作流配合,并给你的
所有表一个id 列做为它们主键。[我们稍后会看到,join 表不包含这一点—它们不应该有一
个id 列。]如果你需要用一个现有的schema 工作,Active Record 给你一个简单的途径来为
一个表重写主键的缺省名字。
class BadBook < ActiveRecord::Base
set_primary_key "isbn"
end
通常,Active Record 接受创建的新主键值给你创建的记录并添加到数据库中—它们将
升序的整数(或许是有一定间隔的序列)。但是,如果你重写主键列的名字,你也要接受一个
职责,在你保存新行之前,你要设置主键一个唯一值。或许令人惊讶的是,你还设置一个属
性叫id 来做这些。直到Active Record 被关心,主键属性总是被设置为一个叫id 的属性。
set_primary_key 声明设置用于表的列名字。下面例子代码中,我们使用一个叫id 的属性,
即使数据库内的主键是ISBN。
book = BadBook.new
book.id = "0-12345-6789"
book.title = "My Great American Novel"
book.save
# ...
book = BadBook.find("0-12345-6789")
puts book.title # => "My Great American Novel"
p book.attributes #=> {"isbn" =>"0-12345-6789",
"title"=>"My Great American Novel"}
刚才做的事情有些乱,model 对象的属性有个isbn 列和title 列—id 没有出现。当我们
需要设置主键时,使用id。在所有其它时候,使用实际的列名。
分享到:
评论

相关推荐

    Python3 操作 MySQL 插入一条数据并返回主键 id的实例

    在需要进行表与表之间的关联时,我们通常需要插入数据后立即得到这个数据的主键id以供关联使用。在Java的MyBatis框架中,可以使用标签在insert方法前通过执行SELECT LAST_INSERT_ID()来获取最新插入行的id,这与...

    使用@IdClass创建联合主键,并实现外部关联

    使用@IdClass创建联合主键,并实现外部关联 在 Java Persistence API(JPA)中,联合主键是指由多个字段组成的主键,可以使用@IdClass注解来实现。在本文中,我们将介绍如何使用@IdClass创建联合主键,并实现外部...

    java主键生成 id

    java主键生成,通过自定义前缀加时间生成机制,是主流项目的常用方法,有的是通过JAVA实现,有的是通过存储过程,其实都差不多

    复合主键@IdClass

    ### 复合主键与@IdClass的理解与应用 #### 一、引言 在软件开发过程中,特别是数据库设计阶段,经常遇到需要通过多个字段来唯一标识一条记录的情况,即所谓的复合主键。复合主键相较于单一主键,在数据管理方面...

    java中主键id的注解解释

    本文档简述了有关javabean中id的注解解释,注解本来就很繁琐,但是学好的话用起来还是比较方便的

    主键是Long型的id生成方法,Java实现

    主键是Long型的id生成方法,Java实现.snowflake算法.

    oracle 创建id主键序列 脚本

    创建表时,我们可以将序列与主键约束关联,使得每次插入新行时自动获取序列的下一个值: ```sql CREATE TABLE table_name ( id NUMBER PRIMARY KEY DEFAULT seq_id.NEXTVAL, column2 VARCHAR2(50), column3 ...

    主键与外键的创建

    本文将深入探讨主键与外键的创建,帮助初学者更好地理解这两个概念。 **主键(Primary Key)**是用于唯一标识数据库表中每条记录的字段或一组字段。主键的特性包括: 1. 唯一性:主键的值在表中必须是唯一的,不...

    多语言雪花算法里最好用的主键ID生成工具.zip

    多语言雪花算法里最好用的主键ID生成工具,在缩短ID长度的同时,具备极高瞬时并发处理能力。原生支持 C#/Java/Go/Rust/C/SQL 等等多语言,且提供 PHP 扩展及 Python、Node.js、Ruby 多线程安全调用动态库。支持 k8s ...

    mysql雪花算法生成唯一整型ID主键的实现方法

    MySQL 雪花算法生成唯一整型ID主键的实现主要针对大数据环境下,需要大量生成全局唯一ID的需求。雪花算法是一种分布式ID生成策略,由Twitter开源,其设计目标是在分布式系统中生成具有全局唯一性、有序性和高并发性...

    查询一个表的所有外键名称,主键名称,主键列ID,主键列名,外键表ID,外键列ID,外键列名

    查询一个表的所有外键名称,主键名称,主键列ID,主键列名,外键表ID,外键列ID,外键列名 级联更新,级联删除,索引名称,索引字段名,索引字段位置

    初探SQL语句复合主键与联合主键

     所谓的复合主键 就是指你表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键。 比如 create table test ( name varchar(19), id number, value varchar(10), primary key (name,id) )  ...

    Hibernate各种主键生成策略与配置详解

    Hibernate不参与主键的生成过程,这意味着你需要在调用save()之前通过setter方法为对象设置一个唯一的ID。这种方法虽然灵活,但可能导致并发问题,因此不推荐在多线程或分布式环境中使用。 配置示例: ```xml &lt;id ...

    分步式主键发生器,适合分布式应用的id唯一性

    在这种环境下,如何保证各个节点生成的主键ID不重复,就显得至关重要。 标题“分步式主键发生器,适合分布式应用的id唯一性”所涉及的知识点主要是分布式系统中的ID生成策略。分布式主键发生器的设计目标是确保在...

    JPA注解实现联合主键

    在JPA中,我们可以通过`@IdClass`和`@Id`注解来实现联合主键。下面将详细介绍如何通过这些注解来实现联合主键。 ### 创建复合主键类 首先,需要创建一个复合主键类来存储需要组成联合主键的属性。这个类需要实现`...

    idgenerator分布式主键ID生成器

    迄今为止最全面的分布式主键ID生成器。优化的雪花算法(SnowFlake)——雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W/0.1s)。 原生支持 C#/Java/Go/Rust/C/SQL 等多语言,且提供 PHP 扩展及 ...

    hibernate 无主键表映射

    在Hibernate中,对无主键表的操作与普通实体基本相同,只是在保存和查询时需要传入整个复合主键对象。例如,创建一个新的订单: ```java OrderKey key = new OrderKey(); key.setCustomerId("123"); key.setOrderId...

    Spring的JdbcTemplate插入操作返回主键ID的方法 - - ITeye技术网站.htm

    Spring的JdbcTemplate插入操作返回主键ID的方法 - - ITeye技术网站

    hibernate复合主键设置

    在业务代码中,创建和操作复合主键的实体对象与普通实体对象并无太大区别。只需要确保在创建新的`OrderItem`实例时,为其`id`属性提供正确的`OrderItemId`实例即可。 总结,复合主键在Hibernate中是通过`@...

Global site tag (gtag.js) - Google Analytics