#sql #database #postgresql #performance #postgresql-9.5
#sql #База данных #postgresql #Производительность #postgresql-9.5
Вопрос:
Я создал схему таблицы, но я не знаю, как мне следует запускать сценарий в этом случае, потому что у меня есть ограничения для каждой таблицы, которые требуют создания других, есть ли способ добавить ограничение после создания или какой-либо другой метод, чтобы оставить правильную схему таблицы равной в сценарии?
Я использую 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) );
Ответ №1:
Сначала создайте таблицы без ограничений внешнего ключа, а затем используйте 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. Это сработало хорошо, спасибо вам за ответ и ваше время!!
2. Ваше приветствие 🙂
Ответ №2:
Есть две проблемы с ограничениями внешнего ключа:
1. Добавление ограничений
Когда существуют FK, которые циклически связывают подмножества таблиц, вы можете сначала создать таблицы, а затем добавить ограничения позже.
Например:
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. Вставка Данных
При вставке данных, которые зависят друг от друга, вам нужно будет решить, какую строку в какую таблицу вы хотите вставить в первую очередь. Вот почему приведенный выше пример включает DEFERRABLE INITIALLY DEFERRED
в себя первое ограничение.
Таким образом, вы можете вставлять последовательно:
- Начните транзакцию.
- Вставка в
store
—fk1
еще не проверена. - Вставить в
inventory
. Проверяетfk4
. - Вставить в
product
. Проверяетfk2
иfk3
. - Зафиксируйте транзакцию. На этом этапе
fk1
будет окончательно подтверждено.