在Postgres里用Sequence[译]
如果不习惯简书的格式,可以点击下面链接查看:笔记版本
什么是Sequence?Sequence是数据库中一类特殊的对象,其用于生成唯一数字标识符。一个典型的应用场景就是手动生成一系列主键。Sequence和Mysql中的 在表格中怎么使用Sequence?Sequence最常见的场景就是生成
例如:下面的命令会新建一个表和一个Sequence对象,并且把这个Sequence对象关联到这个表上。 test=# CREATE TABLE users ( test(# id SERIAL,-- assign each user a numeric ID test(# name TEXT,test(# age INT4 test(# );
NOTICE: CREATE TABLE will create implicit sequence "users_id_seq" for serial column "users.id" CREATE TABLE
在这个例子里,自动生成的Sequence对象被自动命名为 需要注意的是使用 CREATE TABLE users ( -- make the "id" column a primary key; this also creates
-- a UNIQUE constraint and a b+-tree index on the column
id SERIAL PRIMARY KEY,name TEXT,age INT4
);
怎么把Sequence的值赋给新插入的数据?如果你用了 -- 忽略id
INSERT INTO users (name,age) VALUES ('Mozart',20);
-- 使用DEFAULT关键字
INSERT INTO users (name,age,id) VALUES ('Mozart',20,DEFAULT);
怎么获取Sequence最新生成的数据?你可以使用 SELECT currval(pg_get_serial_sequence('users','id'));
会不会有竞争存在?假如一个数据库客户端插入了一个Sequence生成的值,与此同时另一个客户端又插入了一个值,这样 事实上并不会这样,Sequence通过优雅的设计避免了这个问题。 插入并获取插入的数据ID岂不是需要两个Query语句?使用上文中所说的 pg_exec("INSERT INTO users (name,age) VALUES ('Bach',15);
SELECT currval(pg_get_serial_sequence('users','id'));")
这条指令虽有两条命令,但是只需要和数据库通信一次即可,所以基本可以忽略第二条query的额外耗时。 另外,对于Postgresql 8.2以后的版本,可以直接采用 INSERT INTO users (name,age) VALUES ('Liszt',10) RETURNING id;
该语句会返回新插入的行的ID。 Sequence生成的数据的范围?Sequence生成的是64位的整形数据,我们在上面用的Serial类型是一个32位的整形,如果需要使用64位的Serial则需要使用Serial8类型。 Sequence生成的数据会不连续吗?当然会,Sequence是用于生成唯一的数据标识,并不需要严格连续。比如:如果两个客户端同时插入不同的数据(会调用 事务中的SequenceSequence操作是基于session的,与事务无关。 两个表共享一个Sequence?实现这个功能的最简单做法就是手动生成一个Sequence,然后不要使用Serial类型,而是手动把Sequence绑定到对应的列。 CREATE SEQUENCE common_fruit_id_seq;
CREATE TABLE apples ( id INT4 DEFAULT nextval('common_fruit_id_seq') NOT NULL,price NUMERIC );
CREATE TABLE oranges ( id INT4 DEFAULT nextval('common_fruit_id_seq') NOT NULL,weight NUMERIC );
更多Sequence的资料见Postgresql文档:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |