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
的表中尝试过这个方法,但仍然没有成功。因此,再次重命名表并使用完全限定路径解决了问题。