运行 带约束的数据库创建脚本

Running database creation script with constraints

我创建了一个 table 模式,但我不知道在这种情况下我应该如何 运行 脚本,因为我对每个需要创建的 table 都有限制其他的,有没有什么方法可以在创建后添加约束,或者有其他方法可以在脚本中保持正确的 table 模式相等?

我正在使用 PostgreSQL 作为数据库。

CREATE TABLE IF NOT EXISTS store (
    id INTEGER NOT NULL,
    nome VARCHAR(255) NOT NULL,
    document VARCHAR(80) NOT NULL,
    store_product INTEGER NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY (store_product) REFERENCES product (id)
);

CREATE TABLE IF NOT EXISTS product (
    id INTEGER NOT NULL,
    nome VARCHAR(255) NOT NULL,
    price NUMERIC(15,2) NOT NULL,
    store_id INTEGER NOT NULL,
    inventory_id INTEGER NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY (store_id) REFERENCES store (id),
    FOREIGN KEY (inventory_id) REFERENCES inventory (id)
);

CREATE TABLE IF NOT EXISTS inventory (
    id INTEGER NOT NULL PRIMARY KEY,
    amount INTEGER NOT NULL,
    product_id INTEGER NOT NULL,
    FOREIGN KEY (product_id) REFERENCES product (id)
);

首先创建没有外键约束的表,然后使用 ALTER 为外键更改它,这将是一种解决方法

 CREATE TABLE IF NOT EXISTS store (
    id INTEGER NOT NULL,
    nome VARCHAR(255) NOT NULL,
    document VARCHAR(80) NOT NULL,
    store_product INTEGER NOT NULL,
    PRIMARY KEY (id),
);

  CREATE TABLE IF NOT EXISTS product (
    id INTEGER NOT NULL,
    nome VARCHAR(255) NOT NULL,
    price NUMERIC(15,2) NOT NULL,
    store_id INTEGER NOT NULL,
    inventory_id INTEGER NOT NULL,
    PRIMARY KEY (id)
    
);

CREATE TABLE IF NOT EXISTS inventory (
    id INTEGER NOT NULL PRIMARY KEY,
    amount INTEGER NOT NULL,
    product_id INTEGER NOT NULL,
    
 );


   Alter table store
   ADD Constraint fk
   FOREIGN KEY (store_product) REFERENCES 
   product (id);
   Alter table inventory
   ADD Constraint fk1
   FOREIGN KEY (product_id) REFERENCES 
   product (id);
   Alter table product
   ADD Constraint fk2
    FOREIGN KEY (store_id) REFERENCES store (id),
   FOREIGN KEY (inventory_id) REFERENCES 
    inventory (id);
   

外键约束有两个问题:

1。添加约束

当循环中存在 table 的 link 个子集的 FK 时,您可以先创建 table,然后再添加约束。

例如:

CREATE TABLE store (
    id INTEGER NOT NULL,
    nome VARCHAR(255) NOT NULL,
    document VARCHAR(80) NOT NULL,
    store_product INTEGER NOT NULL,
    PRIMARY KEY (id)
);

CREATE TABLE product (
    id INTEGER NOT NULL,
    nome VARCHAR(255) NOT NULL,
    price NUMERIC(15,2) NOT NULL,
    store_id INTEGER NOT NULL,
    inventory_id INTEGER NOT NULL,
    PRIMARY KEY (id)
);

CREATE TABLE inventory (
    id INTEGER NOT NULL PRIMARY KEY,
    amount INTEGER NOT NULL,
    product_id INTEGER NOT NULL
);

然后:

alter table store add constraint fk1 
FOREIGN KEY (store_product) REFERENCES product (id) 
deferrable initially deferred;

alter table product add constraint fk2 
FOREIGN KEY (store_id) REFERENCES store (id);

alter table product add constraint fk3 
FOREIGN KEY (inventory_id) REFERENCES inventory (id);

alter table inventory add constraint fk4 
FOREIGN KEY (product_id) REFERENCES product (id);
2。插入数据

插入相互依赖的数据时,您需要决定要先插入 table 的哪一行。这就是为什么上面的示例在第一个约束中包含 DEFERRABLE INITIALLY DEFERRED

这样就可以依次插入:

  1. 开始交易。
  2. 插入 store -- fk1 尚未验证。
  3. 插入 inventory。验证 fk4.
  4. 插入 product。验证 fk2fk3.
  5. 提交交易。至此fk1将最终得到验证