Запуск сценария создания базы данных с ограничениями

#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 в себя первое ограничение.

Таким образом, вы можете вставлять последовательно:

  1. Начните транзакцию.
  2. Вставка в store fk1 еще не проверена.
  3. Вставить в inventory . Проверяет fk4 .
  4. Вставить в product . Проверяет fk2 и fk3 .
  5. Зафиксируйте транзакцию. На этом этапе fk1 будет окончательно подтверждено.