让我们假设我的表看起来像这样:
user( id SERIAL PRIMARY KEY,
name TEXT, root_id INTEGER NOT NULL
(foreign key to user.id) )
我想要实现的是自动为root_id分配与主键相同的值。
无法使用此表达式
DEFAULT id
"不能在默认表达式"
中使用列引用所以我接下来尝试了这种方法:
DEFAULT CURRVAL('user_id_seq')
然后我得到:"序列的currval" user_id_seq"尚未在本次会议中定义"
当然我可以定义一个触发器功能并在插入之前运行它......但是可能还有一些你能建议的更整洁的解决方案吗?
答案 0 :(得分:1)
这在我的9.1测试中有效,不确定为什么DEFAULT currval('user_id_seq')
的尝试失败了??
CREATE TABLE "user" (
"id" SERIAL,
"name" TEXT,
"root_id" INTEGER NOT NULL DEFAULT currval('user_id_seq'),
CONSTRAINT "user_pkey" PRIMARY KEY ("id")
) WITH (OIDS=FALSE);
然后我检查了它
INSERT INTO "user" ("name") VALUES('mike') RETURNING *;
id | name | root_id
----+------+---------
1 | mike | 1
(1 row)
答案 1 :(得分:0)
您可以使用触发器来模拟此行为:
CREATE FUNCTION user_default_trigger_function()
RETURNS trigger AS '
BEGIN
IF NEW.root_id IS NULL THEN
NEW.root_id := NEW.id;
END IF;
RETURN NEW;
END' LANGUAGE 'plpgsql';
CREATE TRIGGER users_default_trigger
BEFORE INSERT ON users
FOR EACH ROW
EXECUTE PROCEDURE user_default_trigger_function();