默认情况下设置对自身的引用

时间:2015-07-10 12:35:15

标签: postgresql

让我们假设我的表看起来像这样:

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"尚未在本次会议中定义"

当然我可以定义一个触发器功能并在插入之前运行它......但是可能还有一些你能建议的更整洁的解决方案吗?

2 个答案:

答案 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();