运行 带约束的数据库创建脚本
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
。
这样就可以依次插入:
- 开始交易。
- 插入
store
-- fk1
尚未验证。
- 插入
inventory
。验证 fk4
.
- 插入
product
。验证 fk2
和 fk3
.
- 提交交易。至此
fk1
将最终得到验证
我创建了一个 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
。
这样就可以依次插入:
- 开始交易。
- 插入
store
--fk1
尚未验证。 - 插入
inventory
。验证fk4
. - 插入
product
。验证fk2
和fk3
. - 提交交易。至此
fk1
将最终得到验证