【问题标题】:How use nextval in sequence using node-postgres如何使用 node-postgres 按顺序使用 nextval
【发布时间】:2017-04-10 00:50:46
【问题描述】:

我的表 postgres 数据库有一个自动递增键。

在传统的 postgres sql 中我可以:

INSERT INTO CITY(ID,NAME) VALUES(nextval('city_sequence_name'),'my first city');

如何使用 node-postgres 做到这一点?到目前为止,我已经尝试过:

myConnection.query('INSERT INTO city(id,name) VALUES ($1,$2)', ['nextval("city_sequence_name")','my first city'],callback);

但错误规则:

erro { error: sintaxe de entrada é inválida para integer: "nextval("city_sequence_name")"

【问题讨论】:

  • 尝试将'nextval("city_sequence_name")'更改为"nextval('city_sequence_name')"
  • 我刚试过这个。再次出现同样的错误。对不起
  • 那么为什么不直接跳过该列呢? -INSERT INTO CITY(NAME) VALUES('my first city');。这就是通常让自动生成的列生成新值的方式。或者,可以使用INSERT INTO CITY(ID, NAME) VALUES(DEFAULT, 'my first city');

标签: postgresql node-postgres


【解决方案1】:

所以,我能够确定这个案例的解决方案:

connection.query("INSERT INTO city(id,name) VALUES(nextval('sequence_name'),$1)", ['first city'],callback);

【讨论】:

    【解决方案2】:

    这是一种不好的做法。相反,只需将该列设置为 DEFAULT nextval() 或使用 serial 类型。

    # CREATE TABLE city ( id serial PRIMARY KEY, name text );
    CREATE TABLE
    # \d city
                             Table "public.city"
     Column |  Type   |                     Modifiers                     
    --------+---------+---------------------------------------------------
     id     | integer | not null default nextval('city_id_seq'::regclass)
     name   | text    | 
    Indexes:
        "city_pkey" PRIMARY KEY, btree (id)
    
    # INSERT INTO city (name) VALUES ('Houston'), ('Austin');
    INSERT 0 2
    test=# TABLE city;
     id |  name   
    ----+---------
      1 | Houston
      2 | Austin
    (2 rows)
    

    【讨论】:

    • 为什么这是一个不好的做法?在应用程序代码中处理序列插入不是很好吗?
    • @GaetanoPiazzolla 因为您希望代表序列的列多久默认为该序列中的下一个值以外的任何值?如果它默认为下一个值,为什么要在应用程序代码中显式编写默认值?此外,更新的方法甚至不会向用户公开nextval(),因为它使用的是标准化的IDENTITY COLUMNs。
    • 您可能没有考虑过的一件事:如果您使用 java 和 JPA - 该库确实为序列使用了下一个 val 的预分配,因此它不需要运行每次插入新行时都会新的“nextVal”:)
    猜你喜欢
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 2016-08-24
    • 2019-10-09
    • 1970-01-01
    相关资源
    最近更新 更多