如何使用PostgreSQL中的ALTER TABLE将外键约束添加到同一个表

Nic*_*ick 5 postgresql foreign-keys alter-table

要创建表我使用:

CREATE TABLE category
(
  cat_id serial NOT NULL,
  cat_name character varying NOT NULL,
  parent_id integer NOT NULL,
  CONSTRAINT cat_id PRIMARY KEY (cat_id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE category
  OWNER TO pgsql;
Run Code Online (Sandbox Code Playgroud)

parent_id是另一个类别的id.现在我有一个问题:如何与其子级级联删除记录?我需要将parent_id设置为cat_id的外键.我试试这个:

  ALTER TABLE category 
ADD CONSTRAINT cat_cat_id_fkey FOREIGN KEY (parent_id)
      REFERENCES category (cat_id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE
Run Code Online (Sandbox Code Playgroud)

但它落在:

ERROR:  insert or update on table "category" violates foreign key constraint "cat_cat_id_fkey"
DETAIL:  Key (parent_id)=(0) is not present in table "category".
Run Code Online (Sandbox Code Playgroud)

Igo*_*nko 6

您遇到的问题 - parent_id层次结构顶部的类别是什么?

如果它将null- 它将打破NOT NULLconstratint.

如果它会是一些任意数字0- 它会破坏外键(就像在你的例子中).

常见的解决办法-滴NOT NULL上constratint parent_id并设置parent_idnull顶级类别.