我有一个.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中有类似的可能性吗?
答案 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);