我需要读取函数中序列的当前值.但是,在每个会话中我第一次尝试使用currval(),我得到以下错误:
currval of sequence "foo_seq" is not yet defined in this session
Run Code Online (Sandbox Code Playgroud)
提示那些可能通过Google搜索此错误找到此问题的人:您需要通过nextval()或setval()初始化每个会话的序列.
我可以使用类似lastval()甚至setval('your_table_id_seq', (SELECT MAX(id) FROM your_table));相反的东西,但这似乎要么容易出现间隙,要么比简单慢currval().我的目标是避免间隙和不一致(我知道一些值将手动添加),因此在逻辑处理它们之前使用nextval()并不适合我的目的.我还需要这个来初始化会话的序列,但我更喜欢这样做:
--start of the function here
IF is_not_initialized THEN
SELECT setval('foo_seq', (SELECT MAX(id) FROM bar_table)) INTO _current;
ELSE
SELECT currval('foo_seq') INTO _current;
END IF;
--some magic with the _current variable and nextvalue() on the right position
Run Code Online (Sandbox Code Playgroud)
关键是我不知道"is_not_initialized"是什么样子,以及它是否可能.有没有任何功能或其他技巧呢?
编辑:实际上,我的计划是让每一组客户在正确的序列,完全没有序列,以及我现在要求的奇怪的"类似序列"之间进行选择.即使客户想要这样一个奇怪的序列,它也只能用于需要它的列 - 通常是因为有一些模拟数据,我们需要将它们的密钥(通常几乎无间隙的序列)存储到DB中以便向后兼容.
无论如何,你是对的,这不是正确的解决方案,并且在这些情况下没有顺序可能比这种凌乱的解决方案更好,所以我会再次考虑(并与客户讨论)是否真的需要它.
我迭代一个数组,并对数组值及其键执行一些操作。从PostgreSQL 9.1开始有了foreach循环,所以数组值没有问题,但是有什么优雅的方法来获取key吗?我发现的唯一解决方案是为此维护额外的变量:
CREATE OR REPLACE FUNCTION foobar( bar integer[] ) RETURNS integer AS $$
DECLARE
foo integer;
barkey integer;
BEGIN
barkey := 1;
FOREACH foo IN ARRAY bar LOOP
-- do some stuff using foo and barkey
barkey := barkey + 1;
END LOOP;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
这是最好的解决方案,还是有更优雅的解决方案?
假设我有一个触发器函数,但它的代码非常复杂,因此将其拆分为更多过程会很方便。我想在所有变量中使用 NEW (或 OLD 对于 UPDATE/DELETE 触发器)变量进行操作。是否有其他方法可以将其作为函数参数发送到从原始触发函数调用的每个过程?
我通过Adminer 4.1.0管理我的MySQL数据库.现在我想在现有表中添加一列,除了键入ALTER TABLE"SQL命令"窗口外我没有找到怎么做.缺乏这样的基本功能对我来说并没有瘫痪(我知道SQL足够了),但仍然很烦人.我错过了什么,或者SQL命令窗口真的是将列添加到Adminer中现有表的唯一方法吗?
我在尝试创建外键时不断收到错误1064:
ALTER TABLE `zajimavost`
ADD CONSTRAINT FK_zaj_bod
FOREIGN KEY def_bod
REFERENCES `bod`(`gid`)
ON UPDATE CASCADE ON DELETE CASCADE;
Run Code Online (Sandbox Code Playgroud)
它抱怨说:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'REFERENCES `bod`(`gid`)
ON UPDATE CASCADE ON DELETE CASCADE' at line 4
Run Code Online (Sandbox Code Playgroud)
无论有没有反引号我试过它,问题总是一样的.
我的桌子:
CREATE TABLE `zajimavost` (
`zaj_id` int(11) NOT NULL,
`lok_id` int(11) NOT NULL,
`nazev` varchar(255) COLLATE utf8_czech_ci NOT NULL,
`kategorie` int(11) NOT …Run Code Online (Sandbox Code Playgroud) postgresql ×3
mysql ×2
adminer ×1
alter-table ×1
arrays ×1
foreach ×1
foreign-keys ×1
list ×1
loops ×1
plpgsql ×1
python ×1
sequence ×1
session ×1
triggers ×1
tuples ×1