Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql pg_get_serial_序列无法识别表名_Sql_Postgresql_Syntax_Sql Insert_Auto Increment - Fatal编程技术网

Sql pg_get_serial_序列无法识别表名

Sql pg_get_serial_序列无法识别表名,sql,postgresql,syntax,sql-insert,auto-increment,Sql,Postgresql,Syntax,Sql Insert,Auto Increment,我试图通过在过程中使用pg_get_SERIAL_sequence()获取表中创建的最后一个SERIAL ID,但我一直收到一个错误: [42P01]错误:关系“用户”不存在 其中:SQL函数“插入新用户”语句2 User表肯定存在,因为我可以从中选择 下面是用于创建受my函数影响的两个表的DDL脚本: CREATE TABLE users.User ( ID SERIAL PRIMARY KEY, Name TEXT NOT NULL UNIQUE, EmailAddr

我试图通过在过程中使用
pg_get_SERIAL_sequence()
获取表中创建的最后一个
SERIAL ID
,但我一直收到一个错误:

[42P01]错误:关系“用户”不存在

其中:SQL函数“插入新用户”语句2

User
表肯定存在,因为我可以从中选择

下面是用于创建受my函数影响的两个表的DDL脚本:

CREATE TABLE users.User
(
    ID SERIAL PRIMARY KEY,
    Name TEXT NOT NULL UNIQUE,
    EmailAddress TEXT,
    ROWCREATE_TS TIMESTAMP,
    IS_ACTIVE BOOLEAN,
    INACTIVE_TS TIMESTAMP
);

CREATE TABLE users.Credential
(
    CredentialValue TEXT,
    UserId INT REFERENCES users.User(ID)
);
下面是返回错误的过程:

/**
  Creates a new user
 */
CREATE OR REPLACE PROCEDURE users.INSERT_NEW_USER(userName TEXT, emailAddress TEXT, password TEXT)
LANGUAGE SQL
AS $$
    INSERT INTO users.User
    (
        NAME,
        EmailAddress,
        ROWCREATE_TS,
        IS_ACTIVE
    )
    SELECT
        INSERT_NEW_USER.userName,
        INSERT_NEW_USER.emailAddress,
        CURRENT_TIMESTAMP,
        TRUE
    WHERE
        NOT EXISTS(
            SELECT TRUE
            FROM users.User
            WHERE
                NAME = INSERT_NEW_USER.userName
        );

    INSERT INTO users.Credential
    (
        CREDENTIALVALUE,
        USERID
    )
    VALUES
    (
        INSERT_NEW_USER.password,
        (SELECT currval(pg_get_serial_sequence('user', 'id')))
    );
$$;
(注意:在有人提到之前-我不打算在这里以纯文本形式存储密码。)


我可以采取什么不同的措施来解决
pg\u get\u serial\u sequence
不识别
用户
表的问题,或者最终将最后创建的ID存储到一个可用变量中,我可以将该变量传递到我的
插入到用户中。Credential
语句?

通过使用注释中的建议组合解决了这一问题

我已经重命名了该表,因为
User
是PostgreSQL关键字,并且在
pg\u get\u serial\u sequence()
调用中使用了完全限定名
users.NewTableName
,如下所示

选择currval(pg_get_serial_sequence('users.NewTableName','id'))

编辑:对于未来有类似问题的读者来说,值得一提的是,以下内容也可以帮助我实现将ID降到第二条语句的目标。我可以用
来做这件事:

CREATE OR REPLACE PROCEDURE users.INSERT_NEW_USER(userName TEXT, emailAddress TEXT, password TEXT)
LANGUAGE SQL
AS $$
    WITH Inserted as(
        INSERT INTO users.Users
        (
            NAME,
            EmailAddress,
            ROWCREATE_TS,
            IS_ACTIVE
        )
        SELECT
            INSERT_NEW_USER.userName,
            INSERT_NEW_USER.emailAddress,
            CURRENT_TIMESTAMP,
            TRUE
        WHERE
            NOT EXISTS(
                SELECT TRUE
                FROM users.Users
                WHERE
                    NAME = INSERT_NEW_USER.userName
            )
        RETURNING ID
    )

    INSERT INTO users.Credential
    (
        CREDENTIALVALUE,
        USERID
    )
    VALUES
    (
        INSERT_NEW_USER.password,
        (SELECT Inserted.ID FROM Inserted)
    );
$$;

话虽如此,我还想建议读者,他们应该避免使用PostgreSQL关键字来命名表、变量等。

user
us保留关键字。您需要引用它:
“User”
-但是如果您发现另一个名称“User”是PostgreSQL中的保留关键字,那就更好了。您可以有名为“user”和“user”的表和列,但您必须始终双引号引用这些名称,并且始终使用相同的大小写。最好完全避开它们。谢谢你的建议。仅仅重命名表是不够的,我还必须使用完全限定的名称,正如@clamp建议的那样。我以前在名为
User
的表中尝试过这个方法,但仍然没有成功。因此,再次重命名表并使用完全限定路径解决了问题。