PostgreSQL表创建错误的顺序

时间:2014-06-03 12:41:11

标签: postgresql

我有一个.sql文件,它创建了许多彼此相关的表。

我做了其他文件进行测试,只有两个语句:

CREATE TABLE "USER" (
  "id" bigint NOT NULL,
  "name" varchar(50),
  PRIMARY KEY ("id"));
CREATE TABLE "PERSON" (
  "id" bigint NOT NULL,
  "name" varchar(50),
  "user" bigint,
  PRIMARY KEY ("id"),
  CONSTRAINT "fk_user" FOREIGN KEY ("user") REFERENCES "USER" ("id"));

如果我正在尝试执行此类文件,这可以正常工作,但如果我有其他顺序 - 首先创建表“PERSON” - 我收到错误:关系“USER”不存在。

是否可以进行一些更改(或在运行'psql'命令时使用一些其他选项),保持订单不变,以使其正常工作?

编辑:我理解为什么在给定的情况下会发生此错误,但我正在考虑一些解决方案,我不需要更改我的CREATE语句的顺序(想象一下,你有数百个表)...在MySQL中你可以简单地使用SET FOREIGN_KEY_CHECKS=0;,这将有效。我在PostgreSQL中有类似的可能性吗?

2 个答案:

答案 0 :(得分:2)

如果您希望表a引用表b,则必须在表b之前创建表a,或者在创建后添加外键引用:

ALTER TABLE a ADD FOREIGN KEY (a_col) REFERENCES b(b_col);

这也可以创建两个相互引用的表,但是除非你创建其中一个DEFERRABLE INITIALLY DEFERRED,否则你将无法创建行。

答案 1 :(得分:1)

您收到错误,因为在PERSON表上创建外键时,它引用了尚不存在的USER表。

您可以通过将FOREIGN KEY CONSTRAINT分离到它自己的语句并在创建两个表之后应用它来解决此问题:

CREATE TABLE "PERSON" (
  "id" bigint NOT NULL,
  "name" varchar(50),
  "user" bigint,
  PRIMARY KEY ("id"));

CREATE TABLE "USER" (
  "id" bigint NOT NULL,
  "name" varchar(50),
  PRIMARY KEY ("id"));

ALTER TABLE "PERSON"
  ADD CONSTRAINT fk_user
  FOREIGN KEY ("user")
  REFERENCES "USER" (id);