mysql 通过获取PostgreSQL中序列的NextVal插入表

zrfyljdw  于 2022-12-03  发布在  Mysql
关注(0)|答案(2)|浏览(151)

我有一个名为SEQ_TABLE的表,其中有两列,SEQ_NAME和ID

SEQ_NAME        |  ID
----------------------
SEQ_TABLE_10    |   1
SEQ_TABLE_20    |   5

其中ID是TABLE_10和TABLE_20的COLUMN_1的最大值
现在,我必须通过从SEQ_TABLE获取序列的nextvalue将新记录插入到TABLE_10中。
我已经编写了如下PostgreSQL查询:

INSERT INTO TABLE_10 (COLUMN_1, COLUMN_2, COLUMN_3) VALUES  ((SELECT nextval(SEQ_TABLE)),   'Bangalore' ,NULL);

当我执行上述查询时,出现以下错误:错误

ERROR: column "SEQ_TABLE_10" does not exist
SQL state: 42703
Character: 99

但是,以下查询在MySQL数据库中运行良好:

INSERT INTO TABLE_TABLE(COLUMN_1, COLUMN_2, COLUMN_3) VALUES  ((SELECT nextval('TABLE_172_SEQ','true')),    'Bangalore' ,NULL);

什么是在PostgreSQLDB中实现此功能的确切Postgres查询?

frebpwbc

frebpwbc1#

您要创建一个序列,而不是一个表(SEQ_TABLE)请参考此链接https://www.postgresql.org/docs/8.1/static/sql-createsequence.html

  • 例如 *
CREATE SEQUENCE serial START 101;
SELECT nextval('serial');
create table MyTable(col1 int,col2 varchar(20));
INSERT INTO MyTable VALUES (nextval('serial'), 'nothing');
qni6mghb

qni6mghb2#

在当前的PostgreSQL版本中,您将使用标识列:

CREATE TABLE table_10 (
   id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
   other text NOT NULL
);

这将隐式生成一个序列。不允许将数字插入到id中,但必须

INSERT INTO table_10 (other) VALUES ('new');

INSERT INTO table_10 (id, other) VALUES (DEFAULT, 'new');

并且id被自动填充以来自序列的下一个值。
在旧版PostgreSQL上,您可以使用serialbigserial

CREATE TABLE table_10 (id serial PRIMARY KEY, other text NOT NULL);

然后id的类型为integer,创建序列table_10_id_seq,并将nextval调用添加到id列的DEFAULT子句。
您可以使用psql中的\d来检查此情况:

\d table_10
                         Table "laurenz.table_10"
 Column |  Type   |                       Modifiers
--------+---------+-------------------------------------------------------
 id     | integer | not null default nextval('table_10_id_seq'::regclass)
 other  | text    | not null
Indexes:
    "table_10_pkey" PRIMARY KEY, btree (id)

此外,序列属于该表,删除该表时将自动删除该序列。
插入行时省略id列,如下所示:

INSERT INTO table_10 (other) VALUES ('something');

然后将使用DEFAULT值。
如果你想“步行”做同样的事情,例如对序列使用不同的名称或不同的起始值,那将像这样工作:

CREATE TABLE table_10 (id integer PRIMARY KEY, other text NOT NULL);
CREATE SEQUENCE table_10_id_seq OWNED BY table_10.id;
ALTER TABLE table_10 ALTER id SET DEFAULT nextval('table_10_id_seq');

相关问题