2017-02-06 9 views
0

Я начал изучать SQL, чтобы иметь возможность собирать данные о потоке производства, поскольку наш текущий метод (Excel-таблица) переживает его полезность.Столбцы SQL-ссылок между таблицами, где ни один столбец не является UNIQUE

Я использую SQlite3 для создания базы данных, но у меня возникает проблема, когда я пытаюсь создать отношения между столбцами отдельных таблиц, но ни один из столбцов в отношении не сохраняет уникальные значения.

Например:

CREATE TABLE process1 (
    Product1ID INTEGER PRIMARY KEY, 
    StartDate TEXT, 
    EndDate TEXT 
); 

CREATE TABLE process2 (
    Product2ID INTEGER PRIMARY KEY, 
    StartDate TEXT, 
    EndDate TEXT 
); 

Как только продукт закончил process1, он входит Process2, поэтому я хотел, чтобы ограничить любые значения в Process2 (StartDate) быть даты уже найдены в Process1 (EndDate).

Но несколько продуктов могут запускать и завершать process1 (и process2) в одну и ту же дату, поэтому ни один из столбцов Date в любой таблице не содержит значений UNIQUE, которые, как я понимаю, являются требованием ограничения родительского ключа для внешних ключей.

Есть ли способ ограничить один столбец таблицы таким образом, чтобы все значения уже существовали в столбце другой таблицы без столбца, содержащего уникальные значения?

+0

все элементы в таблице process1 будут заканчиваться в таблице process2? – happymacarts

+0

@ happymacarts Да, они – joeqesi

+0

, если вы можете изменить структуру таблицы, я могу сделать это примерно так: Идентификатор продукта, p1_start_date, p1_end_date, p2_start_date, p2_end_date, ... Все в одной таблице, если это не сработает – happymacarts

ответ

2
CREATE TABLE products(
    ProductID INTEGER PRIMARY KEY, 
    ProductName TEXT  
); 

CREATE TABLE process1 (
    process1ID INTEGER PRIMARY KEY, 
    ProductID integer, 
    StartDate TEXT, 
    EndDate TEXT, 
    CONSTRAINT process1_productid_fkey FOREIGN KEY (productid) 
     REFERENCES products (productid) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION 
); 

CREATE TABLE process2 (
    process2ID INTEGER PRIMARY KEY, 
    ProductID integer, 
    StartDate TEXT, 
    EndDate TEXT, 
    CONSTRAINT process1_productid_fkey FOREIGN KEY (productid) 
     REFERENCES products (productid) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION 
); 

, то вы можете выбрать с объединением следующим образом.

Select * from products p 
LEFT JOIN process1 p1 on p1.ProductID = p.ProductID 
LEFT JOIN process2 p2 on p2.ProductID = p.ProductID 

 Смежные вопросы

  • Нет связанных вопросов^_^